2016-04-15 9 views
0

ich an Bord nur in ein neues Projekt gekommen sind, und ich sehe dieses Muster eine Menge in Winkel js Code:ein Timeout und Umfang mit anwenden - AngularJS

_.defer(function() { 
$scope.$apply(); 
}); 

Dies ist für mich scheint falsch, aber ich bin nicht sicher warum. Was sind mögliche Gründe dafür, dass Sie warten würden, bis die Winkelinterpolation beendet ist, und dann $ scope aufrufen. $ Apply() nochmal?

+0

vielleicht um den Fehler "Digest bereits in Bearbeitung" zu vermeiden. Eine Variable kann geändert werden, während Angular die Daten "verdaut". Vielleicht kann diese Änderung nicht durch Winkel erkannt werden, so dass ein "$ apply" benötigt wird. Meine 2 Cent – AlainIb

Antwort

1

$apply() Anrufe $digest()

Unter der Haube $ Digest ist die interne Schleife des Winkel zu überprüfen, ob jede binded Daten geändert hat. Meistens müssen Sie $ selbst nicht anrufen, da AngularJS sich darum kümmert. Die einzigen Fälle, die Sie $ apply aufrufen müssen, sind, wenn Sie eine externe Lib verwenden (zum Beispiel wenn Sie eine jquery lib in eine Direktive einfügen oder wenn Sie eine asynchrone Bibliothek wie facebook/twitter verwenden) und angular nicht wissen könnte über das DOM ändert sich. In diesen Fällen können Sie Ihren Code in $timeout umhüllen. Es ist nur eine sichere Möglichkeit für eckig, $ apply anzurufen, wenn es bereit ist, anstatt den Fehler '$digest already in progress error' zu riskieren, wenn Sie $ direkt anwenden.

$timeout (function() { 
    $scope.update = "something has changed"; 
}); 

Auf diese Weise ist die native Winkel Art und Weise, anstatt die Unterstrich-Bibliothek.

Für detaillierte Erklärungen können Sie überprüfen, this article (ein bisschen alt, aber die Grundprinzipien von eckigen bleiben gleich).

Verwandte Themen