2012-09-20 15 views
16

スコープの値を直接更新すると、表示が更新されますが、この値がAJAXコールバックから更新されても更新されません。ここに簡略化した例があります - http://jsfiddle.net/hS8Bs/1/AJAXコールバックからのAngularJS更新値

どうすれば回避できますか?

更新:リンクの2回目のクリックで値が更新されることに気がつきましたが、私が探しているものではありません。

+0

http://jsfiddle.net/hS8Bs/3/また、これは可能な解決策です。しかし、$ httpを使用する以下に述べる他の解決策は、それを行う正しい方法です。 – ganaraj

答えて

41

実際の問題は$scope.$applyの不足です。角度ダイジェスト以外の角度モデルを更新する場合は、適用する必要があります。

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

これは、更新を見ることがdiggestトリガすると、あなたのコードは、内部の例外をスロー適用した場合、それは$exceptionHandlerサービスにリダイレクトされます。

+0

ありがとう、それは私のためにそれを修正! – arnaslu

+0

'$ scope。$ apply'はまさに私が探していたものです。ありがとう! – GameScripting

+0

ありがとう、それは本当に魔法のように動作します!あなたは私の日を救う! – wagyaoo

5

これは選択された回答のアドオンです。Angular JSは、$ apply()関数を実装した時点で、まだ「エラー:$ digest already in progress」と呼ばれていました。

だから私はこの記事にWill Vincent'sコードが見つかりました:それはようなものになるだろう

$scope.safeApply = function(fn) { 
    var phase = this.$root.$$phase; 
    if(phase == '$apply' || phase == '$digest') { 
     if(fn && (typeof(fn) === 'function')) { 
      fn(); 
     } 
    } else { 
     this.$apply(fn); 
    } 
}; 

:ときに安全に、それは)$がすでに進行中のダイジェストをチェックし、のみ$(適用呼び出して、 AngularJS : What's the Angular way to interact with a form? を:

$scope.safeApply(function() { ...code here... });