Wie Ven sagte, geben Sie entweder in jedem $digest
Zyklus unterschiedliche (nicht identische) Objekte zurück oder Sie ändern die Daten zu oft.
Die schnellste Lösung, um herauszufinden, welcher Teil Ihrer App dieses Verhalten verursacht, ist:
- Entfernen Sie alles verdächtige HTML - entfernen Sie im Grunde Ihr gesamtes HTML aus der Vorlage und prüfen Sie, ob keine Warnungen vorhanden sind
- Wenn keine Warnungen angezeigt werden, fügen Sie kleine Teile des von Ihnen entfernten HTML-Codes hinzu und prüfen Sie, ob das Problem erneut auftritt
- Wiederholen Sie Schritt 2, bis Sie eine Warnung erhalten. Sie werden herausfinden, welcher Teil Ihres HTML-Codes für das Problem verantwortlich ist
- weiter untersuchen - der Teil aus Schritt 3 ist dafür verantwortlich, entweder die Objekte auf dem zu mutieren
$scope
oder nicht identische Objekte in jedem $digest
Zyklus zurückzugeben.
- Wenn Sie
$digest
nach Schritt 1 immer noch Iterationswarnungen haben , tun Sie wahrscheinlich etwas sehr Verdächtiges. Wiederholen Sie die gleichen Schritte für die übergeordnete Vorlage / den übergeordneten Bereich / den übergeordneten Controller
Sie möchten auch sicherstellen, dass Sie die Eingabe Ihrer benutzerdefinierten Filter nicht ändern
Beachten Sie, dass es in JavaScript bestimmte Arten von Objekten gibt, die sich nicht so verhalten, wie Sie es normalerweise erwarten würden:
new Boolean(true) === new Boolean(true) // false
new Date(0) == new Date(0) // false
new String('a') == new String('a') // false
new Number(1) == new Number(1) // false
[] == [] // false
new Array == new Array // false
({})==({}) // false
map()
undgroupBy()
dann sicherstellen, dass Ihre$watch
es schmutzige Überprüfungen durchführen,objectEquality
$watch('myFunctionDoingGropby',callback,true)
siehe docs.angularjs.org/api/ng.$rootScope.Scope#$watch$scope
, der die_.map
-ed-Liste einmal zugewiesen wird - aber wie würden Sie im Allgemeinen die besagte schmutzige Prüfung durch Objektgleichheit beeinflussen, wenn Es ist keine manuell erstellte$watch
, die auslöst, aberngRepeat
?Normalerweise passiert dies, wenn Sie jedes Mal ein anderes Objekt zurückgeben.
Wenn Sie dies beispielsweise in a verwenden
ng-repeat
:Sie erhalten diese Fehlermeldung, weil Angular versucht, die "Stabilität" zu erreichen, und die Funktion ausführt, bis sie zweimal dasselbe Ergebnis zurückgibt (im Vergleich zu
===
). In unserem Fall wird dies niemals true zurückgeben, da die Funktion immer a zurückgibt neues Objekt.In diesem Fall können Sie das Problem beheben, indem Sie das Objekt direkt im Gültigkeitsbereich speichern, z
Auf diese Weise geben Sie immer das gleiche Objekt zurück!
(Das sollten Sie auch bei komplexen Anwendungen niemals antreffen).
Update: Angular hat auf seiner Website ausführlichere Erklärungen hinzugefügt .
quelle
Ich wollte diese Lösung nur hier reinwerfen, hoffentlich hilft sie anderen. Ich bekam dieses Iterationsproblem, weil ich über eine generierte Eigenschaft iterierte, die bei jedem Aufruf ein neues Objekt erstellte.
Ich habe das Problem behoben, indem ich das generierte Objekt bei der ersten Anforderung zwischengespeichert und dann immer den Cache zurückgegeben habe, falls vorhanden. Es wurde auch eine Dirty () -Methode hinzugefügt, die die zwischengespeicherten Ergebnisse nach Bedarf zerstört.
Ich hatte so etwas:
Und hier ist die implementierte Lösung:
quelle
Ich hatte das gleiche Problem - ich habe jedes Mal ein neues Datum erstellt. Für alle, die sich mit Daten befassen, habe ich alle Anrufe wie folgt konvertiert:
zu:
Das Initialisieren einer Nummer anstelle eines Datumsobjekts hat es für mich gelöst.
quelle
Es besteht auch die Möglichkeit, dass es sich überhaupt nicht um eine Endlosschleife handelt. 10 Iterationen sind keine ausreichend große Zahl, um mit Sicherheit darauf schließen zu können. Bevor Sie also einer Wildgansjagd nachgehen, kann es ratsam sein, diese Möglichkeit zuerst auszuschließen.
Die einfachste Methode, dies zu tun, besteht darin, die maximale Anzahl der Digest-Schleifen auf eine viel größere Zahl zu erhöhen, was
module.config
mit der$rootScopeProvider.digestTtl(limit)
Methode in der Methode möglich ist. Wenn derinfdig
Fehler nicht mehr auftritt, haben Sie einfach eine ausreichend komplexe Aktualisierungslogik.Wenn Sie Daten oder Ansichten bauen auf rekursive Uhren verlassen können Sie sich für iterative Lösungen gesucht werden soll (dh nicht auf neue Digest - Schleifen unter Berufung gestartet werden) verwenden
while
,for
oderArray.forEach
. Manchmal ist die Struktur nur stark verschachtelt und nicht einmal rekursiv. In diesen Fällen ist wahrscheinlich nicht viel zu tun, außer das Limit anzuheben.Eine andere Methode zum Debuggen des Fehlers ist das Betrachten der Digest-Daten. Wenn Sie den JSON hübsch drucken, erhalten Sie ein Array von Arrays. Jeder Eintrag der obersten Ebene stellt eine Iteration dar. Jede Iteration besteht aus einer Liste von Überwachungseinträgen.
Wenn Sie beispielsweise eine Eigenschaft haben, die in a
$watch
on selbst geändert wird , ist leicht zu erkennen, dass sich der Wert unendlich ändert:Natürlich ist dies bei größeren Projekten möglicherweise nicht so einfach, zumal das
msg
Feld häufig den Wert hat,"fn: regularInterceptedExpression"
wenn die Uhr eine{{ }}
Interpolation ist.Abgesehen davon sind die bereits erwähnten Methoden, wie das Reduzieren des HTML-Codes, um die Ursache des Problems zu finden, natürlich hilfreich.
quelle
Der einfache Weg ist: Verwenden Sie angle.js, nicht die min-Datei. öffne es und finde die Zeile:
Zeile unten hinzufügen:
und aktualisieren Sie dann Ihre Seite. In der Konsole der Entwicklertools finden Sie Ihren Fehlercode.
quelle
Es ist ein bekannter Fehler
ui-router
, der uns geholfen hat: https://github.com/angular-ui/ui-router/issues/600quelle
Ich möchte auch erwähnen, dass ich diese Fehlermeldung erhalten habe, als ich einen Tippfehler in der templateUrl einer benutzerdefinierten Direktive hatte, die ich in meinem Projekt hatte. Aufgrund des Tippfehlers konnte die Vorlage nicht geladen werden.
Überprüfen Sie auf der Registerkarte "Netzwerk" der Entwicklungstools Ihres Webbrowsers, ob bei einer Ressource ein 404-Fehler vorliegt.
Leicht zu übersehen, da die Fehlermeldung sehr kryptisch ist und scheinbar nichts mit dem eigentlichen Problem zu tun hat.
quelle
Ich hatte dieses Problem in meinem Projekt, weil in .otherwise () meine Routendefinition fehlte und ich eine falsche Route traf.
quelle
Ich hatte dieses Problem, weil ich das tat
Stattdessen: (note = vs ===) begann mein Unit-Test zu brechen und ich fand meine Dummheit
quelle
Ich bin auf dieses Problem gestoßen, bei dem ich einen dynamischen Tooltip benötigte ... dies führte dazu, dass Angular ihn jedes Mal als neuen Wert neu berechnete (obwohl er derselbe war). Ich habe eine Funktion erstellt, um den berechneten Wert wie folgt zwischenzuspeichern:
Dann habe ich im HTML folgendermaßen darauf zugegriffen:
quelle
So näherte ich mich dem und fand eine Lösung: Ich überprüfte den Text und zeigte:
Beobachter feuerten in den letzten 5 Iterationen: [[{"msg": "Anweisung === statment && functionCall ()", "newVal": [{"id": 7287, "referen ...
Also, wenn Sie das sehen können
Das ist die Aussage, die den Fehler erzeugt. Ich habe die in dieser Nachricht aufgerufene Funktion überprüft und von allen zurückgegeben (false), um festzustellen, welche das Problem haben. Einer von ihnen rief eine Funktion auf, die die Rückgabe ständig ändert, was das Problem ist.
quelle
So verrückt es auch klingen mag, ich habe diesen Fehler behoben, indem ich meinen Browser neu gestartet habe, als er plötzlich auftauchte.
Eine Lösung besteht darin, einfach den Cache Ihres Browsers zu leeren oder den Browser neu zu starten.
quelle