Comment obtenir le nom de champ de saisie de Angular2 FormControl objet?
J'ai Angulaire à 2 application qui utilise le ReactiveForms
module pour gérer un formulaire qui utilise un validateur personnalisé. Le validateur reçoit un FormControl
objet. J'ai quelques champs de saisie qui pourraient utiliser le même validateur personnalisé si seulement je savais le nom du champ lors de la FormControl
a été passé au validateur.
Je ne trouve pas de méthode ou propriété publique sur FormControl
qui expose le champ de saisie du nom. Il est assez simple de voir sa valeur, bien sûr. Ce qui suit montre comment je voudrais l'utiliser:
public asyncValidator(control: FormControl): {[key: string]: any} {
var theFieldName = control.someMethodOfGettingTheName(); //this is the missing piece
return new Promise(resolve => {
this.myService.getValidation(theFieldName, control.value)
.subscribe(
data => {
console.log('Validation success:', data);
resolve(null);
},
err => {
console.log('Validation failure:', err);
resolve(err._body);
});
});
}
OriginalL'auteur Michael Oryl | 2016-11-01
Vous devez vous connecter pour publier un commentaire.
Nous pouvons utiliser
.parent
bien, eh bien aujourd'hui,["_parent"]
(voir plus bas):et maintenant nous sommes prêts à adapter nos validateur définition
.parent
plus tard,["_parent"]
maintenantAu moment (aujourd'hui), la version actuelle est :
2.1.2 (2016-10-27)
Mais suit cette question: exploit(formes): "parent" propriété publique de "AbstractControl'
Et comme déjà dit ici
2.2.0-bêta.0 (2016-10-20)
nous pouvions changer plus tard le
["_parent"]
en.parent
FormControl
qui a été adoptée le validateur?Je n'en suis pas sûr au sujet de vos préoccupations. Le point est:
name
d'unFormControl
est donnée seulement par son parentFormGroup
. Parce que seulement ce parent a une CARTE decontrols
et les touches, représentent le nom. Et parce que chaque contrôle possède l'information, qui est son.parent
, nous pouvons obtenir que les informations de n'importe où.. même à l'intérieur de validateur .. juste en appelant le au-dessus de (ou ajusté/optimisé) fonctiongetControlName(controlPassedToValidtor)
. D'autres termes, même unique, de contrôle, passé à validateur fonction est assez - pour obtenir son nom. Seule condition: il doit être de l'enfant deFormGroup
Le problème est l'accès à la FormGroup me donne accès à tous les FormControl il contient, ainsi que le nom de chaque champ qu'ils représentent. Mais en dehors de cette liste de FormControls j'ai maintenant accès à l', comment puis-je savoir que est le FormControl qui a été adoptée dans le programme de validation. J'ai besoin d'un nom de domaine spécifique. Sauf si il y a quelque chose qui me manque, ce que vous fournissez est une liste de tous les champs....
Hmmm comment l'expliquer. Nous avons un contrôle à l'intérieur du valideur. Nous avons une référence. Nous avons aussi un dictionnaire un ensemble de
{ Name1: control1, Name2: control2, ...}
. Chaque contrôle (1, 2, ...) est une instance de certaines FormControl (ou d'autres FormGroup ou FormArray). Ainsi, nous pouvons comparer le control passé au validateur avec chacun d'eux. Si la référence est la mêmecontrol === parent.controls[name]
nous avons eu un match. Tel parent enfant le même que le control passé au validateur. Aider? ou ... ? Je veux dire, nous avons un contrôle, ce que nous faisons.. c'était passé...J'ai étendu ma réponse, avec plus de détails dans les commentaires, et pour la plupart - ont montré comment à l'intérieur du programme de validation, nous pouvons appeler cette fonction, et de recevoir un nom de ce contrôle... j'espère maintenant, c'est clair
OriginalL'auteur
De s'étendre sur les Radim Köhler réponse. voici un moyen plus court de l'écriture de cette fonction.
Ne serait-il pas préférable de construire une Carte de AbstractControls les noms et les regarder qui, plutôt que de générer la liste de clés et alors de la recherche de la liste des clés pour chaque recherche?
OriginalL'auteur
Vous avez deux options:
Avec l'aide de la
Attribute
décorateur:Avec l'aide de la
Input
décorateur:Pour utiliser cette validation doit être une directive de cours.
OriginalL'auteur
Comme Angulaire 4.2.x, vous pouvez accéder à un
FormControl
parentFormGroup
(et son contrôle) de l'aide du public parent propriété:OriginalL'auteur
Pas exactement ce que vous voulez, mais vous pourriez créer dynamiquement le validateur comme dans certains exemples.
comme
Ensuite utiliser le validateur lors de la création de la forme, en passant le nom de la commande
comme
OriginalL'auteur
Vous pouvez définir le nom de contrôle dans les validateurs:
Et puis:
OriginalL'auteur