使用ngResource在几个控制器之间共享相同的数据

时间:2014-01-24 10:10:44

标签: angularjs ngresource

我是棱角分明的新手,所以这可能是一个简单的问题。我现在有这个工厂资源:

angular.module('resources.survey', ['ngResource'])
    .factory('Survey', function ($resource) {
        return $resource('/backend/surveys/:surveyId/data', {surveyId: '@id'});
    });

控制器:

.controller('PagesCtrl', function (Survey) {
        var survey = Survey.get({surveyId: 2});
        //now I want to change survey variable and share it between two controllers
 });

ngResource没有问题我可以从服务器获取数据。但是,我希望使用来自服务器的数据进行操作,并在其他控制器中使用相同的数据(可能使用DI),并允许在那里进行数据操作。我知道可以用$ rootScope完成,但我想知道是否还有其他办法。

4 个答案:

答案 0 :(得分:1)

您的服务应该缓存资源请求的响应,例如调查数组和从此数组中分配调查,而不是直接返回资源对象。

如果返回相同的调查参考,控制器只会共享数据。

粗略地看起来像

.factory('Survey', function ($resource,$q) {
        var surveys[];
        return {
            getSurvey:function(id) {
                var defer=$q.defer();
                //if survery contains the survey with id do //defer.resolve(survey[i]);
                // else query using resource. On getting the survey add it to surveys result and resolve to the newly added survey.
            }
        }
    });

答案 1 :(得分:0)

angular.module('resources.survey', ['ngResource'])
    .factory('Survey', function ($resource) {
        return $resource('/backend/surveys/:surveyId/data', {surveyId: '@id'});
    })
    .controller('MyCtrl', function($scope,Survey){
        //here you can call all the $resource stuff        
    });

答案 2 :(得分:0)

以下是完整的文档和示例如何使用它: http://docs.angularjs.org/api/ngResource.$resource

答案 3 :(得分:0)

我设法创建了一个可以处理我想要的资源。它可能不像Chandermani建议的那样先进。但它适合我的需要。

angular.module('resources.survey', ['ngResource'])
    .factory('Survey', function ($resource) {

        var resource = $resource('/backend/surveys/:surveyId/data',
            {surveyId: '@id'}
        );
        var Survey = {};
        var data = []; //saves the data from server 
        Survey.get = function(surveyId) {

            if(angular.isDefined(data[surveyId])){
                return data[surveyId];
            }

            return data[surveyId] = resource.get({surveyId: surveyId});
        };

        return Survey;
    });

基本上打电话我称之为:

.controller('QuestionsCtrl', function (Survey) {
    Survey.get(1).newData = 'newData'; //adding additional data
    console.log(Survey.get(1));
}); 

我想这可以改进。