#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:

src/app/input-button-unit/input-button-unit.component.ts
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';
}
src/app/input-button-unit/input-button-unit.component.html
    <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 click et non onClick - en Angular, vous supprimez le prΓ©fixe on des Γ©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 Conceptsarrow-up-right.

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

lab-iconPlayground: 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 :

circle-info

πŸ’Ύ 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