Je lutte dans un scénario particulier. Voici à quoi ressemble ma classe Parent and Child
export class ChildComponent{ ..... @Output select: EventEmiiter<SomeType> = new EventEmmiter(); .... .... methodWhichEmits(){ this.select.emit(objectOf_SomeType); } } export class ParentComponent{ onSelect(emittedObject){ //perform some logic event.stopPropagation(); } } Parent Template <child (select)="onSelect($event)"></child>
Je crois comprendre (étant nouveau dans angular) qu'un événement est émis par child et capté par le parent puis la logique est exécutée dans la méthode parent onSelect sur l'événement émis (liaison d'événement).
Mais le problème est que le paramètre de la méthode parente n'est pas un événement mais l'objet de SomeType passé par child. Je souhaite recevoir un événement dans ma méthode parent et accéder aux données émises par child en utilisant l'objet événement (quelque chose comme event.target.value) car j'ai besoin de l'objet événement pour invoquer stopPropagation () sur.
Même si le code fonctionne bien mais le cas de test échoue (sur topPropagation ()) car au lieu d'événement, un objet de SomeType est reçu dans la méthode parent.
3 Réponses :
Un EventEmitter n'est pas un événement HTML mais une extension d'un Subject donc il n'enverra qu'un événement avec une valeur
Les événements Anguar personnalisés ne ressemblent pas aux événements natifs. Ils ne sont que des objets comme vous l'avez remarqué, ils ne se propagent pas et ils ne peuvent pas être annulés.
Si vous pouviez renoncer au type SomeType
, une solution de contournement serait d'appeler stopPropagation ()
dans le composant enfant et d'envoyer la cible
comme paramètre d'événement. Essayez le
Composant enfant suivant
onSelect(target: any) { // handle target }
Composant parent - Modèle
<app-child (select)=onSelect($event)></app-child>
Composant parent - Contrôleur
export class ChildComponent implements OnInit { @Output() select = new EventEmitter(); handleSomething(event) { event.stopPropagation(); this.methodWhichEmits(event.target); } methodWhichEmits(value) { this.select.emit(value) } }
Si vous essayez d'envoyer l ' événement
directement en tant que valeur d'émetteur, il peut y avoir des effets secondaires indésirables dus au bouillonnement d'événement.