FormBuilder Kontrolle verursacht "Ausdruck hat sich verändert, nachdem es überprüft wurde" Ausnahme
Ich habe ein Formular instanziiert wird programmgesteuert über DynamicComponentLoader::loadIntoLocation
. Der Formular-code ist unten:
constructor (
private _builder: FormBuilder
) {
this.editForm = _builder.group({
name: ['', Validators.required],
email: ['', Validators.compose([Validators.required, Helpers.emailValidator])],
phone: [''],
phoneAlt: [''],
location: [''],
dob: [''],
bio: [''],
});
}
Werden Sie feststellen, dass einige Formulare nicht haben, Prüfungen (soweit ich das beurteilen kann, das ist das gleiche wie mit Validators.nullValidator
habe ich getestet mit beiden).
In meinem template ich habe folgenden code (für jede control):
<label for="phone">Contact Number <span *ngIf="!phone.valid">- {{e(phone)}}</span></label>
<input type="text" name="phone" id="phone" ngControl="phone" #phone="ngForm">
Die erste Kontrolle, die nicht mit einem validator wirft die folgende Ausnahme zweimal, wenn es Sie trifft die !phone.valid
Teil der Vorlage:
EXCEPTION: Expression '!phone.valid in e@15:43' has changed after it was checked. Previous value: 'true'. Current value: 'false' in [!phone.valid in e@15:43]
Zu keinem Zeitpunkt bin ich dem berühren der Bedienelemente sowie this.editForm
nach der ersten Schöpfung, so, soweit mein code betroffen ist, sollte nichts ändern.
Ich bin mir bewusst, dass ich unterdrücken kann, die Fehler durch den Aufruf enableProdMode()
aber ich würde lieber das problem lösen als es auszublenden.
Bearbeiten (8. Feb): ich habe da versucht, verschieben Sie den Inhalt des modal auf eine separate Seite, aber der Fehler weiterhin Auftritt. Dies würde vorschlagen, die Frage bezieht sich nicht auf die Art, wie ich bin, das erstellen und laden der modals, sondern die ControlGroup oder FormBuilder.
Plunker des Problems | Plunker ohne modal
InformationsquelleAutor Tam | 2016-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank qdouble für die Lösung dieses für mich auf dem Eckige Gitter chat.
Das Problem schien zu sein, verursacht durch die Reihenfolge, in der die Winkel analysiert die Seite. Indem du von oben nach unten
ngIf="!phone.valid"
wurde analysiert wird, bevorphone.valid
hatte initialisiert worden. Dies war leicht behoben werden, indem ein Haken in der if-Anweisung, um sicherzustellen, dass es nicht null*ngIf="phone.valid === null ? false : !phone.valid"
(oder durch verschieben der label nach der Eingabe).InformationsquelleAutor Tam
Das war das problem, das ich gestoßen bin.
Winkel-2 wurde ein feature eingeführt, um besser verarbeiten zu können (change detection). Winkel-2 Tropfen der digest-Zyklen zu Gunsten von one-way-flow ist etwa 3-10 mal schneller und Griffe asynchrone Logik besser.
Links:
Winkel-Referenz: https://angular.io/docs/ts/latest/api/core/index/ChangeDetectionStrategy-enum.html
Verständnis change detection: https://auth0.com/blog/understanding-angular-2-change-detection/
Wie Eckig 2 Ändern Sie Die Erkennung Wirklich Funktioniert: http://blog.angular-university.io/how-does-angular-2-change-detection-really-work/
InformationsquelleAutor Tetrapike