2016-09-03 6 views
21

Iam neu zu eckigen framework.Here ist mein Szenario, wo ich meine $ scope.variable nach einer gewissen Zeit ändern möchte, so habe ich Javascript setTimeout Methode verwendet.

$scope.variable='Previous'; 

setTimeout(function(){ 
$scope.variable='NEXT'; 
},3000); 

Dieser Code hat bei mir nicht funktioniert. Ich habe $apply() verwendet, damit dieser Code funktioniert.

Später kam ich zu wissen, dass eckig selbst einen $ Timeout-Dienst hat, der die gleiche Arbeit leistet.

$scope.variable='Previous'; 
     $timeout(function() { 
      $scope.variable='NEXT'; 
    }, 2000); 

Wie kann ich vergleichen die Leistung von $timeout Service mit Javascript setTimeout ??

Warum sollten wir $timeout statt setTimeout ??

Bitte geben Sie mir einige Beispiele und Gründe, es zu verwenden, die die Leistung zeigt.

+1

Die Leistung hängt vollständig von der Leistung des Digest-Zyklus in der aktuellen App ab. $ timeout führt zu einem Digest. Für eine App mit einer beträchtlichen Anzahl von Beobachtern, in denen '$ rootScope.$ digest() 'lässt die App einfrieren, sie wird wieder einfrieren. So einfach ist das. – estus

Antwort

17

Es gibt einige Fälle, in denen eine Art von Timeout-Operation ausgeführt werden muss, und wir erreichen dies häufig mit der JavaScript-Funktion setTimeout().

Wenn wir jedoch setTimeout() in einer AngularJS Anwendung verwenden wir brauchen auch $scope.$apply() zu verwenden, um sicherzustellen, dass Änderungen an die scope werden an anderer Stelle reflektiert werden (das heißt dagetenbundenen in einem view).

AngularJS bietet eine handliche Wrapper für diese: $timeout() - es macht den $apply(), für die wir nicht haben, zu $apply die Änderungen.

In Bezug auf die Leistung.

Wenn Sie $timeout verwenden, um im Wesentlichen ein Intervall zu erstellen, dann verwenden Sie es nicht. Wenn Ihre Anwendung groß ist, wird $apply auch einen $digest Zyklus auslösen, den Sie nicht wirklich wollen, dass es passiert, wird es sicherlich die Leistung verringern.

14

Alle AngularJS Umfang variable :) Vielen Dank, wenn von außen (einschließlich Ajax) behandelt braucht ein ($ Aufpreis).

$ timeout() kümmert sich um den aktuellen Bereich und wird im selben Digest-Zyklus ausgeführt, nachdem die Änderungserkennung durchgeführt wurde.

Eine Schönheit von $ timeout(), die ich kürzlich entdeckt habe, ist, wenn Sie den Parameter time nicht übergeben, wird auf den Abschluss des DOM gewartet.

So

$timeout(function(){ 
    console.log("show after directive partial loaded") 
}); //note, no time parameter 

Führen Sie diesen Code in eine Richtlinie und die Timeout-Callback-Funktion wird einmal abgefeuert werden die teilweise durch die Richtlinie

this helps geladen.

+2

Zusätzlich können Sie false als zweiten Parameter an $ timeout übergeben und es wird kein $ apply aufgerufen. Nützlich, wenn Sie den $ Digest manuell steuern möchten. – Ladmerc

+0

Die Antwort ist vage auf die Details und enthält möglicherweise falsche Informationen. Die Anweisung zur Verwendung der Anweisung ist weit hergeholt und erklärt nicht wirklich, wie sie sich von setTimeout + $ scope unterscheidet. $ Apply. '$ timeout (() => {...}, ...)' ist im wesentlichen dasselbe wie 'setTimeout (() => $ scope. $ apply (..), ...)', außer der Tatsache dass ersteres synchron mit '$ timeout.flush()' getestet werden kann (es hat auch eine Option, um den Digest zu überspringen). – estus

Verwandte Themen