J'ai un cas de bouillonnement d'événement. Exemple :
<td (click)="doSomething()">
<text [innerHtml]="content">
// content of innerHtml is : <a href="http://google.com"></a>
</text>
</td>
La balise est rendue à partir d'un autre composant via innerHtml. Le problème: lorsque je clique sur le lien, l'événement click de l'élément se déclenche également. Comment résoudre le problème (arrêter la propagation de doSomething ()), sachant que les gestionnaires d'événements (ou tout code angular 2) ne peuvent pas être transmis via innerHtml?
Je vous remercie!
Solution pourrait simplement placer (click)="$event.stopPropagation()"
sur text
composant, afin que cet événement ne se propage pas du composant d'hébergement. La même chose peut être improvisée en écrivant un Directive
.
<td (click)="doSomething()">
<text (click)="$event.stopPropagation()" [innerHtml]="content">
// content of innerHtml is : <a href="http://google.com"></a>
</text>
</td>
Vous pouvez profiter du bouillonnement. Depuis votre gestionnaire, vous pouvez consulter event.target
pour voir si un A
a été cliqué, et si oui, ignorez votre action.
Soyez prudent, car event.target
peut être le SPAN
! Vous devez non seulement vérifier si la cible de l'événement est une balise A
, mais aussi remonter l'arborescence DOM dans une simulation simple de bullage.
Voici donc une solution possible:
modèle
(click)="doSomething($event)"
composant
export class AppComponent {
content = '<a href="http://google.com">Link text <span>Nested text</span></a>'
doSomething(e) {
let target = e.target;
while (target !== e.currentTarget) {
if (target.tagName == 'A') return;
target = target.parentNode;
}
alert('do something')
}
}
Vous pouvez utiliser $event
objet comme ci-dessous:
<a (click)="stopPropagation($event);false" //<<<----added click event
href="http://google.com">
</a>
stopPropagation(event: Event){
event.stopPropagation();
...
}