2014-01-24 2 views
2

Я новичок в угловом, поэтому, вероятно, это простой вопрос. У меня есть этот фабричный ресурс в данный момент:Поделитесь теми же данными между несколькими контроллерами, используя 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, но мне было интересно, есть ли другой способ.

ответ

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

Не могли бы вы добавить пример, пожалуйста? Это было бы очень полезно. – sarunast

+0

Я довольно новичок в обещаниях ($ q). Почему вы используете их здесь? Как они помогают? – sarunast

+1

Вам нужно знать, когда асинхронный вызов завершен, поэтому вы возвращаете обещание. Поэтому в вашем контроллере вы выполняете 'Survey.getSurvey (1). Then (функция (опрос) {// данные опроса;});' – Chandermani

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

Извините, если я не был очищен. Я это уже знаю. Я знаю, как получать данные и вводить, я не уверен, как делиться одними и теми же данными между двумя контроллерами, которые с изменением боба. – sarunast

0

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

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

Я предполагаю, что это может быть улучшено.

Смежные вопросы