#7: π€ Event binding
Nous voulons que notre application rΓ©agisse aux actions de l'utilisateur. Nous voulons mettre Γ jour le titre de la tΓ’che Γ chaque fois que l'utilisateur le modifie, ou ajouter une nouvelle tΓ’che lorsque l'utilisateur appuie sur le bouton Enregistrer ou sur la touche EntrΓ©e.
Nous n'avons toujours pas toute la liste Γ afficher, mais pour le moment nous allons utiliser une autre faΓ§on de tester l'action. Nous changerons pour la bonne fonctionnalitΓ© plus tard.
Le composant input-button-unit devrait ressembler Γ ceci:
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-input-button-unit',
standalone: true,
imports: [CommonModule],
templateUrl: './input-button-unit.component.html',
styleUrls: ['./input-button-unit.component.scss']
})
export class InputButtonUnitComponent {
title = 'Hello World';
} <p>
input-button-unit works!
The title is: {{ title }}
</p>
<input [value]="title">
<button>Save</button>ImplΓ©menter la mΓ©thode changeTitle
Tout d'abord, implΓ©mentons changeTitle. Il recevra le nouveau titre comme argument :
Event binding
Tout comme la liaison aux propriΓ©tΓ©s des Γ©lΓ©ments, nous pouvons lier aux Γ©vΓ©nements Γ©mis par les Γ©lΓ©ments. Encore une fois, Angular nous donne un moyen facile de le faire. Il suffit d'entourer le nom de l'Γ©vΓ©nement avec des parenthΓ¨ses, et de lui passer la mΓ©thode qui doit Γͺtre exΓ©cutΓ©e lorsque l'Γ©vΓ©nement est Γ©mis.
Essayons un exemple simple, où le titre est modifié lorsque l'utilisateur clique sur le bouton. Remarquez les parenthèses autour de click.
L'Γ©vΓ©nement s'appelle
clicket nononClick- en Angular, vous supprimez le prΓ©fixeondes Γ©vΓ©nements dans les Γ©lΓ©ments.
VΓ©rifiez le rΓ©sultat dans le navigateur : cliquez sur le bouton Save.
Event Data
Nous passons une string statique Γ l'appel de la mΓ©thode: Button Clicked!. Mais nous voulons passer la valeur que l'utilisateur a tapΓ©e dans la zone de saisie !
Dans le prochain chapitre, nous apprendrons Γ utiliser les propriΓ©tΓ©s d'un Γ©lΓ©ment dans un autre Γ©lΓ©ment dans le mΓͺme modΓ¨le. Ensuite, nous pourrons terminer la mise en Εuvre de l'Γ©vΓ©nement de clic du bouton Save. Mais maintenant, nous allons lier une mΓ©thode Γ un Γ©vΓ©nement sur l'Γ©lΓ©ment d'entrΓ©e: lorsque l'utilisateur clique sur EntrΓ©e, la mΓ©thode changeTitle sera appelΓ©e.
EvΓ©nement 'keyup'
Quand l'utilisateur tape, des Γ©vΓ©nements clavier sont Γ©mis. Par exemple keydown et keyup. Nous allons attraper l'Γ©vΓ©nement keyup (lorsqu'une touche enfoncΓ©e est relΓ’chΓ©e) et changer le titre:
Maintenant lorsque l'utilisateur tape dans la zone de saisie, le titre est changΓ© en Button Clicked!.
Tip: Quand un Γ©lΓ©ment HTML devient long en raison de ses attributs, vous pouvez le rendre plus facile Γ lire en le divisant en plusieurs lignes :
L'objet $event
Maintenant nous rΓ©agissons lorsque l'Γ©vΓ©nement keyup se produit. Angular nous permet d'obtenir l'objet Γ©vΓ©nement lui-mΓͺme. Il est passΓ© Γ la liaison d'Γ©vΓ©nement en tant que $event - nous pouvons donc l'utiliser lorsque nous appelons changeTitle().
L'objet Γ©vΓ©nement Γ©mis sur les Γ©vΓ©nements keyup a une rΓ©fΓ©rence Γ l'Γ©lΓ©ment qui a Γ©mis l'Γ©vΓ©nement - l'Γ©lΓ©ment d'entrΓ©e. La rΓ©fΓ©rence est conservΓ©e dans la propriΓ©tΓ© target de l'Γ©vΓ©nement. Comme nous l'avons vu prΓ©cΓ©demment, l'Γ©lΓ©ment d'entrΓ©e a une propriΓ©tΓ© value qui contient la string actuelle qui se trouve dans la zone d'entrΓ©e. Nous pouvons obtenir la valeur actuelle de l'Γ©lΓ©ment d'entrΓ©e en utilisant $event.target.value.
Cependant, si vous essayez de le faire directement dans le modèle, comme indiqué ci-dessous, vous rencontrerez un problème.
TypeScript ne peut pas Γͺtre sΓ»r que $event.target est un Γ©lΓ©ment d'entrΓ©e. Il pourrait s'agir de n'importe quel type d'Γ©lΓ©ment. Et la plupart des Γ©lΓ©ments n'ont pas de membre value.
Nous devons dire Γ TypeScript que nous savons que l'objet $event.target est de type HTMLInputElement, par opposition Γ EventTarget. Le casting est fait avec le mot-clΓ© as. Cependant, il ne peut pas Γͺtre fait dans le modΓ¨le. Si vous essayez de caster dans le modΓ¨le, comme indiquΓ© ci-dessous, vous obtiendrez une erreur.
La solution consiste Γ effectuer le casting dans une mΓ©thode de classe. Comme nous voulons que la mΓ©thode changeTitle soit gΓ©nΓ©rique afin qu'elle puisse Γͺtre utilisΓ©e Γ©galement dans d'autres endroits (comme le bouton), elle doit recevoir une string. Nous ne l'utiliserons donc pas pour recevoir l'Γ©vΓ©nement et le caster.
Nous allons Γ©crire une autre mΓ©thode qui ne sera utilisΓ©e que pour le casting. C'est aussi la solution suggΓ©rΓ©e par le tutoriel Angular : Event Binding Concepts.
Ajoutez la méthode suivante dans la classe du composant, avant ou après la méthode changeTitle.
Maintenant ajustez la mΓ©thode passΓ©e Γ l'Γ©vΓ©nement (keyup) pour qu'elle utilise Γ la fois changeTitle et getInputValue comme ceci:
Vérifiez le résultat dans le navigateur. Maintenant, à chaque frappe de touche, vous pouvez voir que le titre change et reflète la valeur d'entrée.
Appuyer sur la touche EntrΓ©e
Vous pouvez limiter le changement Γ une seule frappe de touche spΓ©ciale, dans notre cas c'est la touche EntrΓ©e. Angular nous facilite vraiment la tΓ’che. L'Γ©vΓ©nement keyup a des propriΓ©tΓ©s qui sont des Γ©vΓ©nements plus spΓ©cifiques. Il suffit donc d'ajouter le nom de la touche Γ laquelle vous souhaitez Γ©couter - dans notre cas, c'est keyup.enter :
Maintenant le titre ne changera que lorsque l'utilisateur appuiera sur la touche EntrΓ©e.
Explorer $event
Playground: Vous pouvez modifier la mΓ©thode getInputValue pour enregistrer l'objet $event dans la console. De cette faΓ§on, vous pouvez l'explorer et voir ses propriΓ©tΓ©s.
Changez la mΓ©thode getInputValue:
Essayez-le !
N'oubliez pas de supprimer console.log(event); avant de continuer.
Vos fichier devraient ressembler Γ ceci :
πΎ Pusher votre code sur GitHub
Committez tous vos changements en exΓ©cutant cette commande dans votre rΓ©pertoire de projet.
Puis pusher vos changements sur GitHub en exΓ©cutant cette commande dans votre rΓ©pertoire de projet.
Last updated