2012-09-20 3 views
16

Wenn ich Scope-Wert direkt aktualisieren, aktualisiert es in Sicht gut, aber wenn dieser Wert von AJAX-Callback aktualisiert wird, wird es nicht aktualisiert. Hier ist ein vereinfachtes Beispiel - http://jsfiddle.net/hS8Bs/1/AngularJS Update-Wert von AJAX Callback

Wie kann ich es umgehen?

Update: Ich bemerkte, dass beim zweiten Klicken auf den Link den Wert aktualisiert, aber es ist nicht das, was ich suche.

+0

http://jsfiddle.net/hS8Bs/3/ Dies ist auch eine mögliche Lösung. Aber die andere Lösung, die unten erwähnt wird, die ein $ http verwendet, ist der richtige Weg, dies zu tun. – ganaraj

Antwort

41

Das eigentliche Problem ist das Fehlen von . Wenn Sie das Winkelmodell außerhalb des eckigen Digests aktualisieren, sollten Sie apply verwenden.

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

Dies löst die diggest das Update, um zu sehen, und wenn Ihr Code in Anwendung von einer Ausnahme aus, es wird auf den $exceptionHandler Dienst weitergeleitet.

+0

Danke, das hat es für mich behoben! – arnaslu

+0

'$ scope. $ Apply' ist genau das, was ich gesucht habe, danke! – GameScripting

+0

Danke, es funktioniert wirklich wie Magie! Du sparst meinen Tag! – wagyaoo

5

Dies ist ein Addon zu der ausgewählten Antwort, ich fand, dass Angular JS immer noch "Fehler: $ Digest bereits in Bearbeitung", als ich die $ apply() -Funktion implementiert.

So fand ich Will Vincent's Code zu diesem Beitrag: AngularJS : What's the Angular way to interact with a form? , es für $ verdauen bereits im Gange prüft und nur $ gelten Anrufe(), wenn sicher:

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

so wäre es so etwas wie:

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