17

スコープ値を直接更新すると、ビューで問題なく更新されますが、この値が AJAX コールバックから更新されると更新されません。ここに簡単な例があります - http://jsfiddle.net/hS8Bs/1/

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

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

4

3 に答える 3

43

本当の問題は、の欠如です$scope.$apply。角度ダイジェストの外部で角度モデルを更新する場合は、apply を使用する必要があります。

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

これにより、ダイジェストがトリガーされて更新が表示され、適用内のコードが例外をスローすると、$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 に答える