Ich habe einen Fall gefunden, in dem die Änderungserkennung bei einem Fehler in eine Endlosschleife eintritt.
Der fragliche Code:
@Component({selector: "signup-comp"})
@View({
directives: [CORE_DIRECTIVES, FORM_DIRECTIVES],
template: `
<form #f="form" (ng-submit)='onSignUp(f.value)'>
<div ng-control-group='credentials' #credentials="form">
Login <input type='text' ng-control='login'>
Password <input type='password' ng-control='password'>
</div>
<div *ng-if="!d.valid">Credentials are invalid</div>
<div ng-control-group='personal'>
Name <input type='text' ng-control='name'>
</div>
<button type='submit'>Sign Up!</button>
</form>
`
})
Der Schlüssel ist der ng-if
Ausdruck !d.valid
. d
ist nicht definiert und dies löst eine Endlosschleife aus.
Hier ist ein vollständiges Plunker-Beispiel .
Es scheint, dass <div ng-control-group='credentials'></div>
Kombination mit ng-if
ausreicht, um den Fehler auszulösen.
Ich bin der Ursache auf die Spur gekommen:
NgControlGroup
deklariert ein onInit
Methode, die Zeitpläne einige Arbeit asynchron abgeschlossen werden, über PromiseWrapper.resolve
.
Das Problem ist, dass onInit
tatsächlich mehrmals aufgerufen werden kann - es wird aufgerufen, wenn die Änderungserkennung läuft und nie erfolgreich abgeschlossen wurde. Wenn während der Änderungserkennung nach dem Aufruf von onInit
eine Ausnahme auftritt, wird AbstractChangeDetector.alreadyChecked
nicht gesetzt und onInit
wird beim nächsten Tick erneut ausgeführt. Da onInit
in NgControlGroup
asynchrone Arbeit plant, erfolgt der nächste Tick sofort und verursacht eine Absturzschleife.
Dieses Problem wurde aufgrund von Inaktivität automatisch gesperrt.
Bitte reichen Sie ein neues Problem ein, wenn Sie auf ein ähnliches oder verwandtes Problem stoßen.
Lesen Sie mehr über unsere Richtlinie zum automatischen Sperren von Konversationen .
_Diese Aktion wurde automatisch von einem Bot ausgeführt._
Hilfreichster Kommentar
Ich bin der Ursache auf die Spur gekommen:
NgControlGroup
deklariert einonInit
Methode, die Zeitpläne einige Arbeit asynchron abgeschlossen werden, überPromiseWrapper.resolve
.Das Problem ist, dass
onInit
tatsächlich mehrmals aufgerufen werden kann - es wird aufgerufen, wenn die Änderungserkennung läuft und nie erfolgreich abgeschlossen wurde. Wenn während der Änderungserkennung nach dem Aufruf vononInit
eine Ausnahme auftritt, wirdAbstractChangeDetector.alreadyChecked
nicht gesetzt undonInit
wird beim nächsten Tick erneut ausgeführt. DaonInit
inNgControlGroup
asynchrone Arbeit plant, erfolgt der nächste Tick sofort und verursacht eine Absturzschleife.