Aus irgendeinem Grund muss ich meine App im Produktionsmodus ausführen. Was ist der Unterschied zwischen diesen Modi?
Aus irgendeinem Grund muss ich meine App im Produktionsmodus ausführen. Was ist der Unterschied zwischen diesen Modi?
Antworten:
Im Entwicklungsmodus führt die Änderungserkennung unmittelbar nach dem ersten Lauf einen zweiten Lauf durch und erzeugt einen Fehler, wenn sich ein gebundener Wert zwischen dem ersten und dem zweiten Lauf geändert hat. Dies hilft beim Auffinden von Fehlern, bei denen das Überprüfen von Werten Nebenwirkungen hat oder Felder oder Funktionen bei nachfolgenden Aufrufen nicht denselben Wert zurückgeben, was die Änderungserkennung von Angular untergräbt.
Im Entwicklungsmodus führt Angular während des zweiten Änderungserkennungslaufs auch einige tiefgreifende Objektvergleiche durch, die in der Produktion nicht durchgeführt werden, um unzulässige Modelländerungen zu erkennen.
Aktualisieren:
Im Entwicklungsmodus wird auch ein Hinweis auf die Konsole gedruckt, wenn der HTML-Bereinigungsdienst Werte aus Bindungen [innerHTML]="..."
oder entfernt [ngStyle]="..."
. Siehe auch: In RC.1 können einige Stile nicht mithilfe der Bindungssyntax hinzugefügt werden
In den Dokumenten für ApplicationRef.tick () heißt es :
Führt im Entwicklungsmodus
tick()
auch einen zweiten Änderungserkennungszyklus (TTL = 2) durch, um sicherzustellen, dass keine weiteren Änderungen erkannt werden. Wenn während dieses zweiten Zyklus zusätzliche Änderungen erfasst werden, haben Bindungen in der App Nebenwirkungen, die nicht in einem einzigen Änderungserkennungsdurchlauf behoben werden können. In diesem Fall gibt Angular einen Fehler aus, da eine Angular-Anwendung nur einen Änderungserkennungsdurchlauf haben kann, während dessen die gesamte Änderungserkennung abgeschlossen sein muss.
Der Grund dafür, dass wir keine zusätzlichen Änderungen vornehmen können, ist, dass die Änderungserkennung im Produktionsmodus nur einmal ausgeführt wird. Dies bedeutet, dass jede Komponente im Komponentenbaum einmal untersucht wird (TTL = 1) ... von oben in der Tiefe zuerst Auftrag. Wenn beispielsweise eine Änderung der Eingabeeigenschaft einer untergeordneten Komponente eine Änderung einer anderen Eigenschaft bewirkt, die die übergeordnete Komponente in einer Ansicht / Vorlage gebunden hat, wird die Ansicht der übergeordneten Komponente nicht aktualisiert (da die Änderungserkennung die nicht erneut aufruft übergeordnete Komponente im Produktionsmodus ... aufgrund der Baumdurchquerung "One Pass"). Es wird erst aktualisiert, wenn das nächste Mal ein Ereignis eintritt und die Änderungserkennung erneut ausgeführt wird - aber das ist zu spät!
Hier ist ein Plunker , der gegen die Regel verstößt : Eine untergeordnete Komponente verfügt über eine set
Methode für eine Eingabeeigenschaft, mit der eine andere Eingabeeigenschaft geändert wird . Ja, es ist ein erfundenes Beispiel, aber es ist leichter zu verstehen als das nächste:
Ein weiteres Szenario, in dem dieses Problem auftreten kann, sind Stateful Pipes. Schauen Sie sich diese Antwort an, wenn dies Ihr Problem ist.
Sie sollten Ihr Problem beschreiben (in einer anderen SO-Frage). Es sollte einen Weg geben, dies zu beheben.