Qu'est-ce que ngDefaultControl Angulaire?
Non, ce n'est pas une double question. Vous voyez, il ya une tonne de questions et de problèmes dans la et Github qui prescrivent que je ajouter de la présente directive à une balise qui a [(ngModel)]
directive et n'est pas contenue dans un formulaire. Si je n'ai pas l'ajouter, j'obtiens une erreur:
ERROR Error: No value accessor for form control with unspecified name attribute
Ok, l'erreur disparaît si j'ai mis cet attribut n'. MAIS, attendez! Personne ne sait ce qu'il fait! Et Angulaire de la doc ne mentionne pas du tout. Pourquoi ai-je besoin d'un accesseur quand je sais que je n'ai pas besoin? Comment est cet attribut relié à la valeur des accesseurs? Qu'est-ce directive faire? Ce qui est une valeur acessor et comment puis-je l'utiliser?
Et pourquoi tout le monde continuer à faire les choses qu'ils ne comprennent pas t tout? Il suffit d'ajouter cette ligne de code et il fonctionne, je vous remercie, ce n'est pas la façon d'écrire de bons programmes.
Et puis. J'ai lu non pas un mais deux énorme guides sur les formes Angulaire et une section sur ngModel
:
- https://angular.io/guide/forms
- https://angular.io/guide/reactive-forms
- https://angular.io/guide/template-syntax#ngModel
Et vous savez quoi? Pas une seule mention de la valeur des accesseurs ou ngDefaultControl
. Où est-il?
Vous devez vous connecter pour publier un commentaire.
[ngDefaultControl]
Tiers contrôles nécessitent un
ControlValueAccessor
pour fonctionner avec des formes angulaires. Beaucoup d'entre eux, à l'instar du Polymère<paper-input>
, se comportent comme de l'<input>
élément naturel et peut donc utiliser leDefaultValueAccessor
. L'ajout d'unngDefaultControl
attribut va leur permettre d'utiliser cette directive.ou
C'est donc la raison principale de cette attrubute a été introduit.
Il a été appelé
ng-default-control
attribut dans les versions alpha de angular2.Donc
ngDefaultControl
est l'un des sélecteurs pour DefaultValueAccessor directive:Ça veut dire quoi?
Cela signifie que nous pouvons appliquer cet attribut à l'élément(comme composant polymère) qui ne possède pas sa propre valeur accesseur. De sorte que cet élément va prendre le comportement de
DefaultValueAccessor
et nous pouvons utiliser cet élément avec des formes angulaires.Sinon, vous devez fournir votre propre mise en œuvre de
ControlValueAccessor
ControlValueAccessor
Angulaire docs unis
Nous allons écrire le modèle suivant en simple angular2 application:
Pour comprendre comment nos
input
ci-dessus va se comporter nous avons besoin de savoir qui sont appliquées les directives à cet élément. Ici angulaire donne quelque astuce avec l'erreur:Bon, on peut ouvrir de la SORTE et obtenir la réponse: l'importation
FormsModule
à votre@NgModule
:Nous avons importé et tout fonctionne comme prévu. Mais que se passe sous le capot?
FormsModule exportations pour nous, les directives suivantes:
Après quelques recherches, on découvre que les trois directives seront appliquées à notre
input
1) NgControlStatus
2) NgModel
3) DEFAULT_VALUE_ACCESSOR
NgControlStatus
directive juste manipule des classes commeng-valid
,ng-touched
,ng-dirty
et nous pouvons omettre ici.DefaultValueAccesstor
fournitNG_VALUE_ACCESSOR
jeton dans les fournisseurs de tableau:NgModel
directive injecte dans le constructeurNG_VALUE_ACCESSOR
jeton qui a été déclaré sur le même hôte élément.Dans notre cas
NgModel
va injecterDefaultValueAccessor
. Et maintenant NgModel directive appels partagésetUpControl
fonction:Et voici le pont en action:
NgModel
met en place le contrôle (1) et les appelsdir.valueAccessor !.registerOnChange
méthode.ControlValueAccessor
magasins de rappel dansonChange
(2) des biens et des feux de cette fonction de rappel lorsqueinput
événement se produit (3). Et enfinupdateControl
fonction est appelée à l'intérieur de rappel (4)où angulaire appels formes API
control.setValue
.C'est une version courte de la façon dont il fonctionne.
@Input() ngModel
et@Output() ngModelChange
bidirectionnel de liaison et j'ai pensé qu'il devrait être suffisant d'un pont. Cela ressemble à faire la même chose dans une manière complètement différente. Peut-être que je ne devrais pas le nom de mon champngModel
?@Input() value; @Output() valueChange: EventEmitter<any> = new EventEmitter();
puis il suffit d'utiliser[(value)]="someProp"
ngModel
et Angulaires ont commencé à jeter une erreur en me demandant avec ControlValueAccessor.