Обмен данными между контроллерами AngularJS, но наличие общих данных происходит от вызова Ajax
Я выяснил, как делиться данными между двумя контроллерами AngularJS, используя совместно используемую службу в приведенном ниже примере:
(Функционирование fiddle)
var app = angular.module('myApp', []);
app.factory('UserData', function() {
var data = {foo: 'bar'};
return {
getData: function() {
console.log('getData');
return data;
},
setData: function(newData) {
data = newData;
}
};
});
function MainCtrl($scope, UserData) {
console.log('MainCtrl');
console.log(UserData.getData());
}
MainCtrl.$inject = ['$scope', 'UserData'];
function JobListCtrl($scope, UserData) {
console.log('JobListCtrl');
console.log(UserData.getData());
}
JobListCtrl.$inject = ['$scope', 'UserData'];
Моя проблема в том, что мне хотелось бы, чтобы данные, содержащиеся в UserData
, поступали из вызова Ajax (предположительно, используя $http
).
Я попытался выполнить вызов Ajax в функции UserData
factory, но, поскольку он выполняется асинхронно, MainCtrl
и JobListCtrl
выполняются до того, как служба UserData
действительно имеет в ней какие-либо данные.
Может кто-нибудь дать мне какое-то направление о том, как настроить это?
Ответы
Ответ 1
Я создал этот пример, который показывает, как извлекать, хранить и обмениваться данными (моделями) на разных контроллерах, не теряя привязываемых функциональных возможностей.
Живой пример: http://pablodenadai.github.io/SharingModelsAngularJS/
Исходный код 1: (абстракция ресурсов и моделей) https://github.com/pablodenadai/SharingModelsAngularJS/blob/master/app/scripts/controllers/main.js
Репо: https://github.com/pablodenadai/SharingModelsAngularJS
Надеюсь, что это поможет.
Ответ 2
Вот несколько отправных пунктов, которые помогут вам:
-
Как получить данные с сервера (и как построить базовую услугу "model" ): SO post
-
Как удерживать выполнение контроллера до тех пор, пока данные не будут получены с сервера: screencast from egghead.io
/li >