2014-02-26 4 views
5

tl; dr: Die erste Frage lautete: "Wie kann ich jeden Digest-Zyklus rückgängig machen?" aber die zugrunde liegende Frage ist viel interessanter und da dies beides beantwortet, habe ich den Titel modifiziert und modifiziert. =)Wie überprüft man, ob sich die Digest-Zyklen stabilisiert haben (aka "Hat eckige Kompilierung?")

Kontext: Ich versuche Winkel zu steuern, wenn die HTML-Kompilierung (für SEO Pre-Rendering Gründen) beendet hat, nachdem alle seine Abhängigkeiten, ngincludes, API-Aufrufe Lösung usw. Die „klügsten“ Weg Ich habe bisher festgestellt, ob die Verdauungszyklen sich stabilisiert haben.
Also dachte ich mir, wenn ich jedesmal einen Callback austrage, wenn ein Digest-Zyklus ausgelöst wird und auf die aktuelle Zeit bleibt, wenn kein anderer Zyklus innerhalb eines willkürlichen Ablaufs (2000ms) ausgelöst wird, können wir uns überlegen, ob sich die Kompilation stabilisiert hat ist bereit für SEO Crawler archiviert zu werden.

Bisheriger Fortschritt: Ich dachte mir $ $ rootScope. $$ Phase würde aber tun, während viele Interaktionen diesen Beobachter auslösen sollte, ich finde es nur einmal ausgelöst, bei der ersten Ladung.

Hier ist mein Code:

app.run(function ($rootScope) { 
    var lastTimeout; 
    var off = $rootScope.$watch('$$phase', function (newPhase) { 
    if (newPhase) { 
     if (lastTimeout) { 
     clearTimeout(lastTimeout); 
     } 
     lastTimeout = setTimeout(function() { 
     alert('Page stabilized!'); 
     }, 2000); 
    } 
    }); 



Lösung: Added Mr_Mig ‚s-Lösung (Kudos) sowie einige Verbesserungen.

app.run(function ($rootScope) { 
    var lastTimeout; 
    var off = $rootScope.$watch(function() { 
    if (lastTimeout) { 
     clearTimeout(lastTimeout); 
    } 
    lastTimeout = setTimeout(function() { 
     off(); // comment if you want to track every digest stabilization 
     // custom logic 
    }, 2000); 
    }); 
}); 

Antwort

3

ich eigentlich gar nicht wissen, ob mein Rat Ihre Frage beantworten, aber Sie könnten einfach einen Zuhörer an die $watch Funktion übergeben, die bei jeder Iteration genannt wird:

$rootScope.$watch(function(oldVal, newVal){ 
    // add some logic here which will be called on each digest cycle 
}); 

Werfen Sie einen Blick hier: http://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch

+0

Danke! Es war mir nicht eingefallen, dass ich den Beobachter als Auslöser benutzen könnte ... Funktioniert wie ein Zauber! =) –

+1

Beachten Sie, dass es einmal für jeden $ digest ausgelöst wird, nicht einmal für jeden $ digest-Zyklus. Ein Zyklus kann $ digest mehrmals aufrufen. – tasseKATT

+0

Ich bin mir bewusst. Ich wünschte, ich könnte etwas effizienteres finden ... Danke! –

Verwandte Themen