Maxing out on $digest Iterationen
Ich bin Herumspielen mit den Richtlinien und =
Bindung in diesem fiddle. Ich bin immer der folgende Fehler:
Uncaught Error: 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [["fn: function () {\n var parentValue = parentGet(parentScope);\n\n if (parentValue !== scope[scopeName]) {\n //we are out of sync and need to copy\n if (parentValue !== lastValue) {\n //parent changed and it has precedence\n lastValue = scope[scopeName] = parentValue;\n } else {\n //if the parent can be assigned then do so\n parentSet(parentScope, lastValue = scope[scopeName]);\n }\n }\n return parentValue;\n }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"],["fn: function () {\n var parentValue = parentGet(parentScope);\n\n if (parentValue !== scope[scopeName]) {\n //we are out of sync and need to copy\n if (parentValue !== lastValue) {\n //parent changed and it has precedence\n lastValue = scope[scopeName] = parentValue;\n } else {\n //if the parent can be assigned then do so\n parentSet(parentScope, lastValue = scope[scopeName]);\n }\n }\n return parentValue;\n }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"],["fn: function () {\n var parentValue = parentGet(parentScope);\n\n if (parentValue !== scope[scopeName]) {\n //we are out of sync and need to copy\n if (parentValue !== lastValue) {\n //parent changed and it has precedence\n lastValue = scope[scopeName] = parentValue;\n } else {\n //if the parent can be assigned then do so\n parentSet(parentScope, lastValue = scope[scopeName]);\n }\n }\n return parentValue;\n }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"],["fn: function () {\n var parentValue = parentGet(parentScope);\n\n if (parentValue !== scope[scopeName]) {\n //we are out of sync and need to copy\n if (parentValue !== lastValue) {\n //parent changed and it has precedence\n lastValue = scope[scopeName] = parentValue;\n } else {\n //if the parent can be assigned then do so\n parentSet(parentScope, lastValue = scope[scopeName]);\n }\n }\n return parentValue;\n }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"],["fn: function () {\n var parentValue = parentGet(parentScope);\n\n if (parentValue !== scope[scopeName]) {\n //we are out of sync and need to copy\n if (parentValue !== lastValue) {\n //parent changed and it has precedence\n lastValue = scope[scopeName] = parentValue;\n } else {\n //if the parent can be assigned then do so\n parentSet(parentScope, lastValue = scope[scopeName]);\n }\n }\n return parentValue;\n }; newVal: {\"baz\":3}; oldVal: {\"baz\":3}"]] angular.js:7729
Scope.$digest angular.js:7729
Scope.$apply angular.js:7894
(anonymous function) angular.js:930
invoke angular.js:2788
bootstrap angular.js:928
angularInit angular.js:904
(anonymous function) angular.js:14397
trigger angular.js:1695
(anonymous function) angular.js:1930
forEach angular.js:110
eventHandler angular.js:1929
Warum ist das passiert? Ich denke, es hat etwas zu tun mit der =
verbindlich.
Wirklich? Sie haben noch keine Fehler in der Konsole? Welchen browser verwenden Sie?
Oops! Ich sehe es jetzt. Ich werde Sie einfach löschen Sie meinen Kommentar.
Oops! Ich sehe es jetzt. Ich werde Sie einfach löschen Sie meinen Kommentar.
InformationsquelleAutor Nick Heiner | 2012-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, weil es ist die Schaffung einer Marke neues Objekt jedes mal geht es durch die digest-Zyklus. Uhren sind registriert in diesem
=
databinding, und so jedes mal, es wertetbar="{baz: 3}"
ein neues Objekt erstellt wird, und so wird es anders sein als der Vorherige Wert, trigerring anderen digest-loop. Schließlich bricht er ab, so dass es nicht in eine Endlosschleife. Sehen http://docs.angularjs.org/guide/concepts#runtime für eine ausführliche Erklärung.Der trick ist, zu tun, die
=
databing mit einem Verweis, dass nicht jedes mal ändert, wenn. Dies wird normalerweise getan, indem er es in den Bereich außerhalb der Richtlinie. Sehen http://jsfiddle.net/u4BTu/7/scope.$watch()
?scope.$watch()
hat einen Dritten parameter, der, wenn true, wird die "Compare-Objekt für die Gleichstellung eher als Referenz." Siehe docs.angularjs.org/api/ng.$rootScope.Scope#$UhrIst es möglich zu bestimmen, dass ein Richtlinien '=' die Bindung sollte mit dem Objekt-Gleichheit-Vergleich statt Verweis, so dass Sie zum definieren des json-Objekts in html-Code anstelle der Strg?
Dieser Fehler ist so nervig. Was ist eine elegante Weise, um es zu lösen?
Der Schlüssel ist, um sicherzustellen, dass was auch immer Objekt, das Sie tun, die 2-Wege-Datenbindung auf nicht erstellen Sie eine neue Referenz für jeden digest-Zyklus. Zusammen eine Geige demonstriert Ihr spezifisches problem.
InformationsquelleAutor dnc253
Gibt es einen Weg, das zu erreichen Objekt-literal expression auf der HTML-Vorlage:
Dies ist ein Auszug aus meiner Liste der Winkel-bindende Beispiele. Finden Sie unter Nummer 6: https://gist.github.com/CMCDragonkai/6282750
InformationsquelleAutor CMCDragonkai
Fügen Sie diesen code in Ihre Anwendung definition oder app.js Dies erhöht digestTtl für die Applikation.
InformationsquelleAutor Shubham Takode