Wie Feuer den `valueChanges` programmgesteuert?
Auf einer meiner Seiten benutze ich ein FormBuilder
zu füllen ein Formular bei der Initialisierung. Jeder Eingang bekommt eine Klasse, wenn der Eingangswert ist nicht leer. Dies erfolgt durch hinzufügen einer ngClass
zu jedem Eingang, und ein Abonnement auf die FormGroup
's valueChanges
.
Mein problem tritt auf, wenn die form gefüllt ist programmgesteuert. Wenn ein Benutzer ändert den Wert auf der form valueChanges
aufgerufen wird, dies ist jedoch nicht der Fall, wenn mit einem FormBuilder
.
Meine Frage ist: Wie bekommt man die valueChanges
- Ereignis ausgelöst, wenn die FormBuilder
fertig ist.
Habe ich versucht, mit this.FormGroup.updateValueAndValidity()
, aber dies nicht in irgendetwas.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich eine Lösung gefunden, die für mich gearbeitet. Ich vergaß zwei Parameter in der
updateValueAndValidity
Funktion.FormControl
wenn wahr.valueChanges
Ereignisses ausgelöst werden, wenn true.Also als Ergebnis erhalten Sie so etwas wie:
FormGroup.updateValueAndValidity({ onlySelf: false, emitEvent: true });
onlySelf
tut. EinAbstractControl
von denenFormControl
ist eine Unterklasse hat eineparent
Eigenschaft. Und von den docsIf onlySelf is true, this change will only affect the validation of this FormControl and not its parent component. This defaults to false.
Also, wenn Sie einen event-handler auf "dieser" Ebene der Form-Hierarchie es wird nicht dazu führen, ein Ereignis ausgelöst auf das übergeordnete Element.Ihre Frage nicht 100% klar, aber ich denke, was du sagst es :
In diesem Fall, was ich Tue, ist ganz einfach:
initialValues
ist die raw-Daten haben Sie initialisiert das Formular mit. Sie konnte wahrscheinlich einfachsearchForm.getRawValue()
zu.Dieser nur bewirkt, dass die beobachtbaren, sofort Feuer.
Den Titel und die Beschreibung deiner Frage sind ein bisschen irreführend. Welche ist es? (i)
valueChanges
eines Feldes aufgerufen wird, wenn der Wert ändert programmgesteuert?Anyways, Lesen Sie in diesem Plunkr: https://plnkr.co/edit/4V4PUFI1D15ZDWBfm2hb?p=preview
Du wirst sehen, dass wenn Sie den Wert des Feldes programmgesteuert so:
Sowohl die Gültigkeit und die
valueChanges
beobachtbar für das Feld aktualisiert werden. So, es sieht aus wie Sie versuchen, neu zu erstellen ein Verhalten, dass bereits hier.Jedoch die
dirty
- Eigenschaft des Feldes wird NICHT aktualisiert, wenn der Wert ändert sich programmatisch (wie pro doc: "Eine Kontrolle ist verschmutzt, wenn der Benutzer verändert den Wert in der Benutzeroberfläche"). Könnte es sein, dass Sie überprüfendirty
- Eigenschaft angeben, den Fehler im Feld und Sie haben die illusion, dass die Gültigkeit status wird nicht aktualisiert, wenn in der Tat es nur diedirty
Eigenschaft, die nicht aktualisiert?(i) Diese beiden Dinge sind anders. Sollten Sie NICHT abonnieren
valueChanges
manuell auslösen Validierung. Validierung erzwungen werden soll, indem er erklärt Prüfer in Ihrer form das Modell.setValue
option mitmarkAsDirty
dies jedoch nicht lösen, mein problem.setValue()
Sie werden sehen, dass es bereits GesprächeupdateValueAndValidity()
. Neben deremitEvent
param festgelegt isttrue
standardmäßig. In anderen Worten, ist das Standardverhalten sollte bereits geben Ihnen alles, was Sie wollen. Vielleicht bist du nicht mit der richtigen syntax zu ändern, das Feld ist-Wert programmgesteuert?FormBuilder
zum initialisieren des Formulars der Inhalt, also ich war erforderlich, um dieFormBuilder
. Wenn ich nur mit einemFormGroup.updateValueAndValidity()
ohne die Parameter, die form nicht entkräften, wie ich es brauche. Allerdings, wenn ich liefern die Parameter, mache ich das Ergebnis bekommen, das ich brauche.