Обмен данными между контроллерами 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 >