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