Значение обновления AngularJS от обратного вызова AJAX
Когда я обновляю значение области напрямую, он обновляется только в режиме просмотра, но когда это значение обновляется с обратного вызова AJAX, оно не обновляется. Вот упрощенный пример - http://jsfiddle.net/hS8Bs/1/
Как я могу обойти это?
Обновление: Я заметил, что нажатие второй раз на ссылке обновляет значение, но это не то, что я ищу.
Ответы
Ответ 1
Реальной проблемой является отсутствие $scope.$apply
. Когда вы обновляете модель angular за пределами angular дайджест, вы должны использовать apply.
$.getJSON('/echo/json/', {}, function(data){
$scope.$apply(function(){
$scope.period = '2010 - 2011';
});
});
Это приведет к тому, что diggest увидит обновление, и если ваш код внутри приложения выдаст исключение, он будет перенаправлен на службу $exceptionHandler
.
Ответ 2
Это аддон к выбранному ответу, я обнаружил, что Angular JS все еще называется "Ошибка: $digest уже выполняется", когда я применил функцию $apply().
Итак, я нашел код Vincent's в этом сообщении:
AngularJS: Каким образом Angular можно взаимодействовать с формой?
, он проверяет, что $digest уже выполняется, и только вызывает $apply(), когда безопасно:
$scope.safeApply = function(fn) {
var phase = this.$root.$$phase;
if(phase == '$apply' || phase == '$digest') {
if(fn && (typeof(fn) === 'function')) {
fn();
}
} else {
this.$apply(fn);
}
};
поэтому было бы что-то вроде:
$scope.safeApply(function() { ...code here... });
Ответ 3
Вот ваш отсутствующий учебник вам нужно использовать параметр $http контроллера, чтобы обновить поле.
Проверьте обновленный пример http://jsfiddle.net/hS8Bs/2/