Cela me rend fou, je suis sous le coup et je ne peux pas me permettre de passer une autre journée entière là-dessus.
J'essaie de définir manuellement une valeur de contrôle («dept») dans le composant, et cela ne fonctionne tout simplement pas - même la nouvelle valeur se connecte correctement.
Voici l'instance FormBuilder:
initForm() {
this.form = this.fb.group({
'name': ['', Validators.required],
'dept': ['', Validators.required],
'description': ['', Validators.required],
});
}
C'est le gestionnaire d'événements qui reçoit le service sélectionné:
deptSelected(selected: { id: string; text: string }) {
console.log(selected) // Shows proper selection!
// This is how I am trying to set the value
this.form.controls['dept'].value = selected.id;
}
Maintenant, lorsque le formulaire est soumis et que je me déconnecte, this.form
le champ est toujours vide! J'ai vu d'autres utilisateurs utiliser updateValue()
mais c'est beta.1 et je ne vois pas cela comme une méthode valide pour appeler le contrôle.
J'ai également essayé d'appeler updateValueAndValidity()
sans succès :(.
Je voudrais simplement utiliser ngControl="dept"
l'élément de formulaire, comme je le fais avec le reste du formulaire, mais c'est une directive / un composant personnalisé.
<ng-select
[data]="dept"
[multiple]="false"
[items]="depts"
(selected)="deptSelected($event)" <!-- This is how the value gets to me -->
[placeholder]="'No Dept Selected'"></ng-select>
la source
Réponses:
Mis à jour: 19/03/2017
VIEUX:
Pour l'instant, nous sommes obligés de faire un cast de type:
Pas très élégant je suis d'accord. J'espère que cela sera amélioré dans les versions futures.
la source
(<Control>this.form.controls['dept']).setErrors(null)
this.form.get('dept').setValue(selected.id)
:)this.form.controls.dept.setValue(selected.id);
this.form.controls['dept'].setValue(selected.id);
Dans Angular 2 Final (RC5 +), de nouvelles API permettent de mettre à jour les valeurs de formulaire. La
patchValue()
méthode API prend en charge les mises à jour partielles de formulaire, où nous n'avons besoin de spécifier que certains des champs:Il existe également la
setValue()
méthode API qui nécessite un objet avec tous les champs du formulaire. S'il manque un champ, nous obtiendrons une erreur.la source
updateValue
(de la réponse acceptée par Filoche) est obsolète en faveur desetValue
updateValue()
et de l'introduction depatchValue
etsetValue
.Aangular 2 final a mis à jour les API. Ils ont ajouté de nombreuses méthodes pour cela.
Pour mettre à jour le contrôle de formulaire à partir du contrôleur, procédez comme suit:
Pas besoin de réinitialiser les erreurs
Références
https://angular.io/docs/ts/latest/api/forms/index/FormControl-class.html
https://toddmotto.com/angular-2-form-controls-patch-value-set-value
la source
setValue()
lorsqu'il est appelé sur aformGroup/formBuilder
, il nécessite que toutes les valeurs du formulaire soient définies.patchValue()
, lorsqu'il est appelé sur le même, pourrait être utilisé pour mettre à jour des valeurs spécifiques.Vous pouvez utiliser les méthodes suivantes pour mettre à jour la valeur d'un contrôle de formulaire réactif. L'une des méthodes suivantes conviendra à vos besoins.
Méthodes utilisant setValue ()
Méthodes utilisant patchValue ()
La dernière méthode effectuera une boucle sur tous les contrôles du formulaire, elle n'est donc pas préférée lors de la mise à jour d'un contrôle unique
Vous pouvez utiliser n'importe quelle méthode à l'intérieur du gestionnaire d'événements
Vous pouvez mettre à jour plusieurs contrôles dans le groupe de formulaires si nécessaire à l'aide du
la source
Vous pouvez essayer ceci:
Pour plus de détails, vous pouvez consulter le document JS correspondant concernant le deuxième paramètre de la
updateValue
méthode: https://github.com/angular/angular/blob/master/modules/angular2/src/common/forms/model. ts # L269 .la source
error TS2339: Property 'updateValue' does not exist on type 'AbstractControl'
. Dans ce composant, le formulaire a le type deControlGroup
. Peut-être que si je les crée individuellement avecnew Control()
cela, cela fonctionneraitAucun de ceux-ci n'a fonctionné pour moi. Je devais faire:
la source
Si vous ne souhaitez pas définir manuellement chaque champ.
la source
Solution mise à jour Angular 2 de @ Filoche. En utilisant
FormControl
(<Control>this.form.controls['dept']).updateValue(selected.id)
Vous pouvez également utiliser la solution @ AngularUniversity qui utilise
patchValue
la source
Je sais que la réponse est déjà donnée, mais je veux donner une brève réponse sur la façon de mettre à jour la valeur d'un formulaire afin que d'autres nouveaux arrivants puissent avoir une idée claire.
votre structure de formulaire est si parfaite pour l'utiliser comme exemple. donc, tout au long de ma réponse, je la désignerai comme la forme.
donc notre formulaire est un FormGroup type d'objet qui a trois FormControl .
Ainsi, lors de la mise à jour de la valeur d'une instance de groupe de formulaires qui contient plusieurs contrôles, mais vous souhaiterez peut-être uniquement mettre à jour des parties du modèle. patchValue () est celui que vous recherchez.
voyons l'exemple. Lorsque vous utilisez patchValue ()
mais lorsque vous utilisez setValue (), vous devez mettre à jour le modèle complet car il adhère strictement à la structure du groupe de formulaires. alors, si nous écrivons
Nous devons transmettre toutes les propriétés du modèle de groupe de formulaires. comme ça
mais je n'utilise pas ce style fréquemment. Je préfère utiliser l'approche suivante qui aide à garder mon code plus propre et plus compréhensible.
Ce que je fais, c'est que je déclare tous les contrôles comme une variable séparée et j'utilise setValue () pour mettre à jour ce contrôle spécifique.
pour le formulaire ci-dessus, je vais faire quelque chose comme ça.
lorsque vous devez mettre à jour le contrôle de formulaire, utilisez simplement cette propriété pour le mettre à jour. Dans l'exemple, l'interrogateur a essayé de mettre à jour le contrôle de formulaire de service lorsque l'utilisateur sélectionnait un élément dans la liste déroulante.
Je suggère de jeter un œil à l' API FormGroup pour connaître toutes les propriétés et méthodes de FormGroup.
Supplémentaire : pour en savoir plus sur getter voir ici
la source
Si vous utilisez le contrôle de formulaire, le moyen le plus simple de le faire:
la source
Conseil: si vous utilisez
setValue
mais ne fournissez pas toutes les propriétés du formulaire, vous obtiendrez une erreur:Must supply a value for form control with name: 'stateOrProvince'.
Vous pourriez donc être tenté d'utiliser
patchValue
, mais cela peut être dangereux si vous essayez de mettre à jour un formulaire entier. J'ai unaddress
qui peut ne pas avoirstateOrProvince
oustateCd
selon qu'il s'agit des États-Unis ou du monde entier.Au lieu de cela, vous pouvez mettre à jour comme ceci - qui utilisera les valeurs nulles par défaut:
la source