17

当我直接更新范围值时,它在视图中更新得很好,但是当这个值从 AJAX 回调更新时它不会更新。这是简化的示例 - http://jsfiddle.net/hS8Bs/1/

我怎样才能绕过它?

更新:我注意到第二次点击链接确实会更新值,但这不是我想要的。

4

3 回答 3

43

真正的问题是缺乏$scope.$apply. 当您在角度摘要之外更新角度模型时,您应该使用 apply。

$.getJSON('/echo/json/', {}, function(data){
    $scope.$apply(function(){
        $scope.period = '2010 - 2011';
    });
}); 

这将触发 diggest 以查看更新,如果您在 apply 中的代码抛出异常,它将被重定向到$exceptionHandler服务。

于 2012-09-20T14:53:20.233 回答
5

这是所选答案的插件,当我实现 $apply() 函数时,我发现 Angular JS 仍然调用“错误:$digest 已经在进行中”。

所以我在这篇文章中找到了Will Vincent 的代码: AngularJS : What's the Angular way to interact with a form? ,它检查 $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... });

于 2013-03-21T02:10:26.597 回答
3

这是您缺少的教程,您需要使用控制器的 $http 参数来更新字段。检查您更新的示例http://jsfiddle.net/hS8Bs/2/

于 2012-09-20T14:38:25.870 回答