Вот моя настройка. У меня есть контроллер, который использует службу, которая выполняет некоторую работу, и затем возвращает данные асинхронно. В этом случае данные возвращаются тайм-аут, но в реальной жизни это было бы сделать что-то более интересное:Правильный способ обработки асинхронных обновлений в угловом контроллере
Вид:
<div ng-controller="RootController as root">
<h1>Angular Project</h1>
<div ng-show="{{root.greeting}}">
<p>{{root.greeting}}</p>
</div>
</div>
Контроллер:
(function(){
'use strict';
function RootController(greetingService) {
var vm = this;
vm.greeting = '';
// startup logic
activate();
function activate() {
greetingService.greeting().then(
function(response) {
vm.greeting = response;
},
function(error) {
vm.greeting = error;
}
);
}
}
RootController.$inject = ['greeting'];
angular.module('app.core').controller('RootController', RootController);
})();
Услуги:
(function() {
'use strict';
// Greeting Service
function greeting($timeout) {
// public API
var service = {
greeting: greeting
};
return service;
// internal functions
function greeting() {
return $timeout(function() {
return 'Hello world!';
}, 1000);
}
}
temp.$inject = ['$timeout'];
angular.module('app.core').factory('greeting', greeting);
})();
Вопросы:
Почему мой просмотр не обновляется, когда тайм-аут разрешается и назначение vm.greeting происходит в моем контроллере? Я видел, как люди описывают «внутри углового и вне углового», но мне кажется, что я не пошел «вне углового» здесь.
Я знаю, что могу называть $ scope. $ Apply(), но я столкнулся с ошибкой «digest is already in progress», и снова мне кажется, что я не должен этого делать.
Есть ли лучший способ организовать мои компоненты? Я также экспериментировал с трансляцией события над $ rootScope и записью обработчика событий в контроллере, но эта компоновка имеет тот же результат (а именно, представление не обновляется при изменении асинхронной модели).
Действительно ли это делает это .success? Можете ли вы проверить, действительно ли установлен vm.greeting? – ribsies
@ribsies да. Я отредактировал код для этого вопроса, чтобы избавиться от всего постороннего, но тайм-аут разрешается, и моя функция .then (success) выполняется. Когда я отлаживаю область в Chrome Dev Tools и смотрю на значение angular.element ($ 0) .scope(). Root.greeting, я вижу правильное значение. – Alex