Значение обновления AngularJS от обратного вызова AJAX - программирование

Значение обновления AngularJS от обратного вызова AJAX

Когда я обновляю значение области напрямую, он обновляется только в режиме просмотра, но когда это значение обновляется с обратного вызова AJAX, оно не обновляется. Вот упрощенный пример - http://jsfiddle.net/hS8Bs/1/

Как я могу обойти это?

Обновление: Я заметил, что нажатие второй раз на ссылке обновляет значение, но это не то, что я ищу.

4b9b3361

Ответ 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... });