Angular: Änderungserkennungsfehler -> Endlosschleife

Erstellt am 23. Sept. 2015  ·  3Kommentare  ·  Quelle: angular/angular

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 .

hours bufix

Hilfreichster Kommentar

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.

Alle 3 Kommentare

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._

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen