在 AngularJS 中的控制器之间共享数据 [英] Share data between controllers in AngularJS

查看:29
本文介绍了在 AngularJS 中的控制器之间共享数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用以下工厂从 API 获取数据并将其存储到名为 apiData 的局部变量中.

I use the following factory to fetch data from API and store it to local variable called apiData.

app.factory('MyFactory', function($resource, $q) {

    var apiData = [];
    var service = {};

    var resource = $resource('http://example.com/api/sampledata/');

    service.getApiData=function() {
        var itemsDefer=$q.defer();
        if(apiData.length >0) {
            itemsDefer.resolve(apiData);
        }
        else
        {
            resource.query({},function(data) {
                apiData=data;
                itemsDefer.resolve(data)
            });
        }
        return itemsDefer.promise;
    };

    service.add=function(newItem){
        if(apiData.length > 0){
            apiData.push(newItem);
        }
    };

    service.remove=function(itemToRemove){
        if(apiData.length > 0){
            apiData.splice(apiData.indexOf(itemToRemove), 1);
        }
    };

    return service;

});

我通过以下方式将 apiData 注入我的控制器:

I inject the apiData into my controllers the following way:

 $routeProvider
    .when('/myview', {
        templateUrl: 'views/myview.html',
        controller: 'MyController',
        resolve: {
            queryset: function(MyFactory){
                return MyFactory.getApiData();
            }
        }
    })

app.controller('MyController', ['$scope', 'queryset',
    function ($scope, queryset) {
        $scope.queryset = queryset;
    }
]);

这是在不同控制器之间共享承诺的好方法还是我最好使用本地存储甚至缓存工厂?

Is it a good way to share a promise between different controllers or I better to use local storage or even cacheFactory?

如何重写 MyFactory add() 和 remove() 方法,以便可以将共享变量保持在当前状态(不需要 API 更新/创建/删除调用)?

How can I rewrite MyFactory add() and remove() methods so that I can keep my shared variable in a current state (no API update/create/delete calls needed)?

谢谢!

推荐答案

你应该使用 $resource 来获取 $promise eg: resource.query().$promise 而不是 $q.defer() 用于更清晰的代码.否则你很高兴去.您可以使用 $cacheFactory,但您也可以使用本地变量.

You should use $resource to get $promise eg: resource.query().$promise instead of $q.defer() for cleaner code. Otherwise you are good to go. You could use $cacheFactory, but you can also use local var.

您的共享变量是否处于当前状态并使用当前代码?

Isn't your shared variable in a current state with current code?

我建议你看看 ui-router 及其嵌套和抽象视图,其中解析值可用于子控制器.

I recommend you take a look at ui-router and its nested and abstract views, where resolved values are available to child controllers.

这篇关于在 AngularJS 中的控制器之间共享数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆