ngModel
permet de créer des liaisons de données bidirectionnelles pour la lecture et l'écriture de valeurs de contrôle d'entrée.CSS
spéciales qui suivent l'état des contrôles.HTML
à l'aide de variables de référence de modèle.Heroclasse
de modèle.ngModel
de liaison de données bidirectionnelle.name
à chaque contrôle de saisie de formulaire.CSS
personnalisés pour fournir un retour visuel.ngSubmit
.angular-forms
:Heroclasse
avec ses trois champs obligatoires (id
, name
, power
) et un champ facultatif (alterEgo
).ng generate class
, générez une nouvelle classe nommée Hero
:TypeScript
génère un champ public
pour chaque paramètre public du constructor
et affecte automatiquement la
valeur du paramètre à ce champ lorsque vous créez des hero
.alterEgo
est optionnel, le constructor
vous permet donc de l'omettre; notez le point d'interrogation (?
) dans alterEgo?
.HTML
et une classe de composants pour gérer les interactions de
données et utilisateur par programme. Commencez par le cours, car il indique brièvement ce que l'éditeur de héros peut faire.ng generate component
, générez un nouveau composant nommé HeroForm
:HeroModel
que vous venez de créer.app-hero-form
" du sélecteur @Component
signifie que vous pouvez déposer ce formulaire dans un modèle parent avec une balise ‹app-hero-form›
.templateUrl
pointe sur un fichier séparé pour le modèle HTML
.model
et powers
comme il convient pour une démonstration.JSON
du modèle.
Cela vous aidera à voir ce que vous faites pendant le développement.app.module.ts
définit le module racine de l'application.
Vous y identifiez les modules externes que vous utiliserez dans l'application et déclarerez les composants
qui appartiennent à ce module, tels que le HeroFormComponent
.FormsModule
à la matrice
de imports
pour le module d'application avant de pouvoir utiliser des formulaires.FormsModule
.FormsModule
à la liste de imports définie dans le décorateur @NgModule
.
Cela donne à l'application un accès à toutes les fonctionnalités des formulaires basés sur des modèles, y compris ngModel
.
directive
ou pipe
appartient à un module dans le tableau imports
,
ne pas le re-déclarer dans le tableau declarations. Si vous l'avez écrit et il devrait appartenir à ce module,
ne le déclarer pas dans le tableau de declarations.AppComponent
est le composant racine de l'application.
Il va accueillir le nouveau HeroFormComponent
.selector
du composant.
Cela affiche la forme du héros lorsque le composant d'application est chargé. N'oubliez pas de supprimer également le champ name
du corps de la classe.HTML5
. Vous présentez deux des champs Hero
, name
et alterEgo
, et les ouvrir pour l'entrée de l'utilisateur dans des boîtes d'entrée.
Le contrôle ‹input›
Name
a l'attribut required
en HTML5.
Le contrôle ‹input›
AlterEgo
ne le fait pas car alterEgo
est optionnel.
Vous avez ajouté un bouton submit
en bas avec quelques classes pour le style
.
Vous n'utilisez pas encore Angular. Il n'y a pas de liaisons ou de directives supplémentaires, juste une mise en page.
Dans les formulaires basés sur des modèles, si vous avez importé FormsModule
, vous n'avez rien à faire avec la balise ‹form› pour pouvoir l'utiliser FormsModule
.
Continuez pour voir comment cela fonctionne.
Angular ne fait aucune utilisation des container, form-group
, form-control
et les btnclasses
ou les styles
d'une bibliothèque externe.
Les applications Angulare peuvent utiliser n'importe quelle bibliothèque CSS ou aucune.styles.css
et ajoutez la ligne d'importation suivante en haut :select
au formulaire et lier les options à la liste powers
en utilisant ngFor
.AlterEgo
:‹option›
pour chaque pouvoir de la liste des pouvoirs.
La variable pow
d'entrée modèle est une puissance différente à chaque itération; vous affichez son nom
en utilisant la syntaxe d'interpolation.[(ngModel)]
,
ce qui facilite la liaison du formulaire au modèle.‹input›
de name
et mettez-la à jour comme ceci :[(ngModel)]="..."
‹form›
balise avec comme suit : #heroForm="ngForm"
heroForm
est maintenant une référence à la directive NgForm
qui régit le formulaire dans son ensemble.NgForm
complète l'élément form
avec des fonctionnalités supplémentaires.
Il contient les contrôles que vous avez créés pour les éléments avec une directive ngModel
et un attribut name et surveille leurs propriétés,
y compris leur validité. Il possède également sa propre propriété valid
, qui n'est vraie que si chaque contrôle contenu est valide.Name
, ajouter et à supprimer des caractères,
vous les verrez apparaître et disparaître du texte interpolé, à un moment donné, cela pourrait ressembler à ceci :name
à la balise ‹input›
et que vous l'avez défini sur "name
",
ce qui a du sens pour le nom du héro. Toute valeur unique fera l'affaire, mais utiliser un nom descriptif est utile.
Définir un attribut name
est une exigence lorsqu'on l'utilise en combinaison avec un formulaire [(ngModel)]
FormControl
et les enregistre avec une directive NgForm
attachée par Angular à la balise ‹form›
.
Chaque FormControl
est enregistré sous le nom que vous avez attribué à l'attribut name
.[(ngModel)]
et des attributs name
similaires à AlterEgo
et à Power
.
Vous allez abandonner le message de liaison de la zone de saisie et ajouter une nouvelle liaison (en haut) à la propriété diagnostic
du composant.
Vous pouvez ensuite confirmer que la liaison de données bidirectionnelle fonctionne pour le modèle de héros entier.id
utilisée par l'attribut de l'élément label
pour faire correspondre l'étiquette à son contrôle d'entrée.name
requise par les formulaires Angular pour enregistrer le contrôle avec le formulaire.ngModel
dans un formulaire vous offre plus qu'une simple liaison de données bidirectionnelle.
Il vous indique également si l'utilisateur a touché le contrôle, si la valeur a changé ou si la valeur est devenue invalide.NgModel
ne fait pas que suivre l'état; il met à jour le contrôle avec des classes CSS
Angular spéciales qui reflètent l'état.
Vous pouvez utiliser ces noms de classe pour modifier l'apparence du contrôle.Etat | Classe si vrai | Classe si faux |
---|---|---|
Le contrôle a été visité. | ng-touched |
ng-untouched |
La valeur du contrôle a changé. | ng-dirty |
ng-pristine |
La valeur du contrôle est valide. | ng-valid |
ng-invalid |
spy
à la balise name
de ‹input›
et utilisez-la pour
afficher les classes CSS
de l'entrée.
name
. Suivez ces étapes avec précision :name
, puis cliquez en dehors de celle-ci.ng-valid
/ ng-invalid
est la plus intéressante, car vous souhaitez envoyer un signal visuel fort lorsque les valeurs ne sont pas valides.
forms.css
que vous ajoutez au projet en tant que frère de index.html
:‹head›
de index.html
pour inclure cette feuille de style:Name
est obligatoire et effacée, la barre devient rouge.
Cela signifie que quelque chose ne va pas, mais que l'utilisateur ne sait pas ce qui ne va pas ou quoi faire.
Utilisez l'état du contrôle pour révéler un message utile.name
, le formulaire doit ressembler à ceci:‹input›
avec les éléments suivants :‹div›
, que vous n'afficherez que si le contrôle est invalide.name
et lui avez donné la valeur ngModel
.name
à la
propriété de l'élément ‹div›
de message hidden
.pristine
, vous masquerez le message uniquement lorsque la valeur est valide.
Si vous arrivez dans ce composant avec un nouveau hero
(vierge) ou un hero
invalide, le message d'erreur
s'affiche immédiatement avant que vous n'ayez rien fait.hero
au formulaire. AlterEgo
est facultatif, vous pouvez donc le laisser.heros
sous cette forme.
Placez un bouton "New Hero" au bas de la fiche et liez son événement click
à une méthode newHero()
de composant.name
et power
.
C'est compréhensible car ce sont des champs obligatoires.
Les messages d'erreur sont masqués car le formulaire est vierge. reset()
du formulaire après avoir appelé la méthode newHero()
.type="submit"
).ngSubmit
du formulaire à la méthode onSubmit()
du composant de formulaire hero :#heroForm
et l'aviez initialisée avec la valeur " ngForm
".
Maintenant, utilisez cette variable pour accéder au formulaire avec le bouton "submit".heroForm
de la propriété disabled
du bouton à l'aide d'une liaison d'événement.
Voici le code :‹div›
et lier sa propriété hidden
à la propriété HeroFormComponent.submitted
.submitted
est false
jusqu'à ce que vous le soumettiez.submitted
devient true
et le formulaire disparaît comme prévu.HTML
suivant sous le ‹div›
wrapper
que vous venez d'écrire :‹div›
n'apparaît que lorsque le composant est à l'état soumis.
Le code HTML
comprend un bouton "Modifier" dont l'événement click
est lié à une expression qui supprime l'indicateur submitted
.
Lorsque vous cliquez sur le bouton "Modifier", ce bloc disparaît et le formulaire modifiable réapparaît.HTML
Angular.@Component
.NgForm.ngSubmit
.#heroForm
et #name
.[(ngModel)]
syntaxe pour la liaison de données bidirectionnelle.name
pour la validation et le suivi des modifications d'éléments de formulaire.NgForm
.CSS
personnalisées fournissant aux utilisateurs un retour visuel sur les contrôles non valides.