Quel est le moyen le plus simple d’arrêter la propagation des événements de souris dans Angular 2? Devrais-je passer un objet $event
spécial et appeler stopPropagation()
moi-même ou autrement? Par exemple, dans Meteor, je peux simplement renvoyer false
à partir du gestionnaire d’événements.
Si vous voulez pouvoir ajouter ceci à n'importe quel élément sans avoir à copier/coller le même code encore et encore, vous pouvez créer une directive pour le faire. C'est aussi simple que ci-dessous:
import {Directive, HostListener} from "@angular/core";
@Directive({
selector: "[click-stop-propagation]"
})
export class ClickStopPropagation
{
@HostListener("click", ["$event"])
public onClick(event: any): void
{
event.stopPropagation();
}
}
Ensuite, ajoutez-le simplement à l'élément sur lequel vous le souhaitez:
<div click-stop-propagation>Stop Propagation</div>
Le plus simple consiste à appeler la propagation d'arrêt sur un gestionnaire d'événements. $event
fonctionne de la même façon dans Angular 2 et contient l'événement en cours (un clic de souris, un événement de souris, etc.):
(click)="onEvent($event)"
sur le gestionnaire d’événements, on peut y arrêter la propagation:
onEvent(event) {
event.stopPropagation();
}
L'appel stopPropagation
sur l'événement empêche la propagation:
(event)="doSomething($event); $event.stopPropagation()"
Pour preventDefault
, il suffit de renvoyer false
(event)="doSomething($event); false"
Ajout à la réponse de @AndroidUniversity. En une seule ligne, vous pouvez l'écrire comme suit:
<component (click)="$event.stopPropagation()"></component>
Si vous êtes dans une méthode liée à un événement, renvoyez simplement false:
@Component({
(...)
template: `
<a href="/test.html" (click)="doSomething()">Test</a>
`
})
export class MyComp {
doSomething() {
(...)
return false;
}
}
Je devais stopPropigation
et preventDefault
afin d'empêcher un bouton de développer un élément d'accordéon qu'il était assis au-dessus.
Alors...
@Component({
template: `
<button (click)="doSomething($event); false">Test</button>
`
})
export class MyComponent {
doSomething(e) {
e.stopPropagation();
// do other stuff...
}
}
Rien n'a fonctionné pour IE (Internet Explorer). Mes testeurs ont réussi à casser mon modal en cliquant dans la fenêtre contextuelle sur les boutons situés derrière. Donc, j'ai écouté pour un clic sur mon div écran modal et forcé refocus sur un bouton contextuel.
<div class="modal-backscreen" (click)="modalOutsideClick($event)">
</div>
modalOutsideClick(event: any) {
event.preventDefault()
// handle IE click-through modal bug
event.stopPropagation()
setTimeout(() => {
this.renderer.invokeElementMethod(this.myModal.nativeElement, 'focus')
}, 100)
}
Je viens juste d’archiver une application Angular 6, event.stopPropagation () fonctionne sur un gestionnaire d’événements sans même passer $ event.
(click)="doSomething()" // does not require to pass $event
doSomething(){
// write any code here
event.stopPropagation();
}
<a href="#" onclick="return yes_js_login();">link</a>
yes_js_login = function() {
// Your code here
return false;
}
<a class="list-group-item list-group-item-action" (click)="employeesService.selectEmployeeFromList($event); false" [routerLinkActive]="['active']" [routerLink]="['/employees', 1]">
RouterLink
</a>
public selectEmployeeFromList(e) {
e.stopPropagation();
e.preventDefault();
console.log("This onClick method should prevent routerLink from executing.");
return false;
}
Mais cela ne désactive pas l'exécution de routerLink!
cela a fonctionné pour moi: mycomponent.component.ts:
action(event): void {
event.stopPropagation();
}
mycomponent.component.ts:
<button mat-icon-button (click)="action($event);false">Click me !<button/>
L'ajout de false après la fonction arrêtera la propagation de l'événement
<a (click)="foo(); false">click with stop propagation</a>
Essayez cette directive
@Directive({
selector: '[stopPropagation]'
})
export class StopPropagatioDirective implements OnInit, OnDestroy {
@Input()
private stopPropagation: string | string[];
get element(): HTMLElement {
return this.elementRef.nativeElement;
}
get events(): string[] {
if (typeof this.stopPropagation === 'string') {
return [this.stopPropagation];
}
return this.stopPropagation;
}
constructor(
private elementRef: ElementRef
) { }
onEvent = (event: Event) => {
event.stopPropagation();
}
ngOnInit() {
for (const event of this.events) {
this.element.addEventListener(event, this.onEvent);
}
}
ngOnDestroy() {
for (const event of this.events) {
this.element.removeEventListener(event, this.onEvent);
}
}
}
Usage
<input
type="text"
stopPropagation="input" />
<input
type="text"
[stopPropagation]="['input', 'click']" />
Cela a résolu mon problème, en évitant qu'un événement soit déclenché par un enfant:
doSmth(){
// what ever
}
<div (click)="doSmth()">
<div (click)="$event.stopPropagation()">
<my-component></my-component>
</div>
</div>