2012-09-20 26 views
16

當我直接更新範圍值時,它在視圖中更新得很好,但是當這個值從AJAX回調更新時它不會更新。這裏是簡化的例子 - http://jsfiddle.net/hS8Bs/1/AngularJS從AJAX回調更新值

我該如何解決它?

更新:我注意到,單擊鏈接上的第二次更新值,但它不是我正在尋找的。

+0

http://jsfiddle.net/hS8Bs/3/這也是一種可能的解決方案。但是下面提到的使用$ http的其他解決方案是正確的。 – ganaraj

回答

41

真正的問題是缺少$scope.$apply。當您更新角度摘要以外的角度模型時,應使用apply。

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

這將觸發diggest看到更新,如果你的代碼中的應用拋出一個異常,它會被重定向到$exceptionHandler服務。

+0

謝謝,它爲我修好了! – arnaslu

+0

'$ scope。$ apply'正是我一直在尋找的,謝謝! – GameScripting

+0

謝謝,它真的很神奇!你拯救我的一天! – wagyaoo

5

這是所選答案的插件,當我實現$ apply()函數時,我發現Angular JS仍然稱爲「Error:$ digest already in progress」。

所以我發現這個職位Will Vincent's代碼: AngularJS : What's the Angular way to interact with a form? ,它會檢查$消化已在進行中,只調用$適用()時,安全:

$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... });