Comment tirer la `valueChanges` par programmation?
Sur une de mes pages j'utilise un FormBuilder
de remplir un formulaire au moment de l'initialisation. Chaque entrée obtient une classe à chaque fois que l'entrée est pas vide. Ceci est fait en ajoutant un ngClass
pour chaque entrée, et en s'abonnant sur le FormGroup
's valueChanges
.
Mon problème se produit lorsque le formulaire est rempli par programmation. Chaque fois qu'un utilisateur modifie une valeur de la forme, valueChanges
est appelée, cependant, ce n'est pas le cas lors de l'utilisation d'un FormBuilder
.
Ma question est: Comment obtenir le valueChanges
événement est déclenché chaque fois que les FormBuilder
est fini.
J'ai essayé d'utiliser this.FormGroup.updateValueAndValidity()
, mais cela n'a pas abouti à rien.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une solution qui a fonctionné pour moi. J'ai oublié deux paramètres dans le
updateValueAndValidity
fonction.FormControl
lorsque la valeur est true.valueChanges
événement est déclenché lorsque la valeur est true.Donc comme résultat, vous obtiendrez quelque chose comme:
FormGroup.updateValueAndValidity({ onlySelf: false, emitEvent: true });
onlySelf
n'. UnAbstractControl
de quiFormControl
est une sous-classe a unparent
de la propriété. Et à partir de la documentationIf onlySelf is true, this change will only affect the validation of this FormControl and not its parent component. This defaults to false.
Donc, si vous avez un gestionnaire d'événements à " ce " niveau de votre Formulaire de hiérarchie, il ne cause pas un événement, être élevé sur le parent.Votre question n'est pas 100% clair, mais je pense que vous êtes le dire :
Dans ce cas, ce que je fais est assez simple:
initialValues
sont les données brutes que vous avez initialisé la forme avec. Vous pourriez probablement juste de mettre ensearchForm.getRawValue()
trop.Cette juste cause observables à feu immédiatement.
Le titre et la description de votre question, un peu trompeur. Qui est-il? (i)
valueChanges
d'un champ est appelée lors de la modification de sa valeur par programmation?De toute façon, découvrez cette Plunkr: https://plnkr.co/edit/4V4PUFI1D15ZDWBfm2hb?p=preview
Vous verrez que lorsque vous définissez la valeur du champ par programmation comme ceci:
À la fois la validité et la
valueChanges
observables pour le domaine sont mis à jour. Donc, il semble que vous essayez de recréer un comportement qui est déjà ici.Cependant, la
dirty
propriété du champ n'est PAS mis à jour lors de la modification de sa valeur par programmation (comme par le doc: "Un contrôle est sale si l'utilisateur a modifié la valeur dans l'INTERFACE utilisateur"). Se pourrait-il que vous la vérification de ladirty
propriété pour indiquer le champ des erreurs et que vous avez le illusion que le statut de validité n'est pas mis à jour, alors qu'en fait c'est juste ledirty
propriété qui n'est pas mis à jour?(i) Ces deux choses sont différentes. Vous ne devez PAS vous inscrire
valueChanges
le déclenchement manuel de validation. La Validation devrait être appliquée en déclarant validateurs dans votre modèle de formulaire.setValue
option avecmarkAsDirty
, cependant, cela n'a pas résolu mon problème.setValue()
vous verrez qu'il appelle déjàupdateValueAndValidity()
. En outre, laemitEvent
paramètre est réglé surtrue
par défaut. En d'autres termes, le comportement par défaut devrait déjà vous donner tout ce que vous voulez. Peut-être que vous n'utilisez pas la bonne syntaxe pour modifier la valeur du champ par programmation?FormBuilder
pour initialiser la forme du contenu, j'ai donc été nécessaires pour utiliser leFormBuilder
. Si je viens d'utiliser unFormGroup.updateValueAndValidity()
sans fournir ses paramètres, le formulaire n'invalident pas combien j'en ai besoin pour. Cependant, si je ne fournir les paramètres, je ne obtenir le résultat dont j'ai besoin.