14-1 Décorateur Output()
Pour communiquer de l'information avec le composant parent, un composant enfant doit envoyer un événement au parent.
Le parent pourra ainsi traiter l'information via une fonction réagissant à l'événement.
Notre cas de figure: Supprimer un projet de la liste et envoyer un événement à ProjetsIndex
pour qu'il le retire du tableau.
Ajouter une sortie @Output()
à ProjetsListe
Premièrement, ajoutons une sortie à ProjetsListe
qui sera responsable d'émettre un événement lorsqu'on veut supprimer un projet.
- Pour déclarer un événement via
@Output
, on utilise@Output()
et on donne un nom à l'événement.src/app/features/projets/components/projets-liste.tsexport class ProjetsListe {
@Input() projets: Projet[] | null = null
@Output() projetDeleted
} - Ensuite, le type est est
EventEmitter
qui lui-même transportera une valeur. Ici, on précisera leid
du projet supprimé, soitnumber
.src/app/features/projets/components/projets-liste.tsexport class ProjetsListe {
@Input() projets: Projet[] | null = null
@Output() projetDeleted = new EventEmitter<number>
}
Ajouter un bouton pour supprimer
Aux côtés de chaque projet, ajoutons un lien pour le supprimer:
template: `
<a class="btn btn-primary" routerLink="/projets/creer">Nouveau projet</a>
@if(projets && projets.length > 0){
<ul>
@for (projet of projets; track $index) {
<li>
{{ projet.nom }} <button class="btn btn-link text-danger btn-sm">Supprimer</button>
</li>
} @empty {
<li>Aucun projet</li>
}
</ul>
} @else {
<p>Aucun projet</p>
}
`,
Ajouter une fonction supprimerProjet()
Lorsque le boutton est cliqué, on appellera cette fonction.
- Créez la fonction
src/app/features/projets/components/projets-liste.ts
export class ProjetsListe {
@Input() projets: Projet[] | null = null
@Output() projetDeleted = new EventEmitter<number>
protected supprimerProjet() {
}
} - Liez la fonction au clic du bouton
src/app/features/projets/components/projets-liste.ts
<li>
{{ projet.nom }} <button (click)="supprimerProjet()" class="btn btn-link text-danger btn-sm">Supprimer</button>
</li> - Vérifiez que le tout fonctionne en affichant un message de confirmation
export class ProjetsListe {
@Input() projets: Projet[] | null = null
@Output() projetDeleted = new EventEmitter<number>
protected supprimerProjet() {
const confirmation = confirm("Êtes-vous certain de vouloir supprimer de projet?");
}
}
Émettre l'événement
Pour émettre l'événement au composant parent, on appelle notre @Output()
via la fonction emit()
.
export class ProjetsListe {
@Input() projets: Projet[] | null = null
@Output() projetDeleted = new EventEmitter<number>
protected supprimerProjet() {
const confirmation = confirm("Êtes-vous certain de vouloir supprimer de projet?");
if(confirmation){
this.projetDeleted.emit()
}
}
Remarquez que la fonction emit()
peut prendre une valeur en argument, soit le type number
que nous avons précisé lors de la déclaration du @Output()
.
@Output() projetDeleted = new EventEmitter<number>
Passer une valeur à l'événement
Il nous faut, au clic du bouton, passer l'identifiant du projet à supprimer et ensuite l'envoyer avec l'événement!
- Modifiez la fonction
supprimerProjet()
pour qu'elle accepte unnumber
, soit l'identifiant du projet à supprimer.src/app/features/projets/components/projets-liste.tsprotected supprimerProjet(projetId: number) {
- Ensuite, lors du clic, passez le id du projet en question
src/app/features/projets/components/projets-liste.ts
<li>
{{ projet.nom }} <button (click)="supprimerProjet(projet.id)" class="btn btn-link text-danger btn-sm">Supprimer</button>
</li> - Finalement, envoyer le id avec l'événement lors de l'émissions!
src/app/features/projets/components/projets-liste.ts
protected supprimerProjet(projetId: number) {
const confirmation = confirm("Êtes-vous certain de vouloir supprimer de projet?");
if(confirmation){
this.projetDeleted.emit(projetId)
}
}