Совместно использовать одни и те же данные между несколькими контроллерами, использующими 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 ответа

Решение

Ваша служба должна кэшировать ответ на запрос ресурса во что-то вроде массива опросов и распределять опросы из этого массива, а не напрямую возвращать объект ресурса.

Контроллеры будут обмениваться данными только в том случае, если возвращается та же ссылка для опроса.

Примерно это будет выглядеть

.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.
            }
        }
    });

Мне удалось создать ресурс, который может обрабатывать то, что я хотел. Это, вероятно, не так продвинуто, как предположил Чандермани. Но это работает для моих нужд.

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));
}); 

Я думаю, это можно улучшить.

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        
    });

Вот полная документация и пример использования: http://docs.angularjs.org/api/ngResource.%24resource

Другие вопросы по тегам