Каков самый простой способ остановить распространение событий мыши в Angular 2?
Должен ли я передавать специальный объект $event
и вызывать stopPropagation()
сам или есть другой способ. Например, в Meteor я могу просто вернуть false
из обработчика событий.
Остановить распространение событий мыши
Ответ 1
Если вы хотите добавить это к любым элементам без необходимости повторного копирования и вставки одного и того же кода, вы можете сделать директиву для этого. Это так просто, как показано ниже:
import {Directive, HostListener} from "@angular/core";
@Directive({
selector: "[click-stop-propagation]"
})
export class ClickStopPropagation
{
@HostListener("click", ["$event"])
public onClick(event: any): void
{
event.stopPropagation();
}
}
Затем просто добавьте его к элементу, который вы хотите:
<div click-stop-propagation>Stop Propagation</div>
Ответ 2
Простейшим является вызов прерывания распространения в обработчике событий. $event
работает одинаково в Angular 2 и содержит текущее событие (кликнув мышкой, событие мыши и т.д.):
(click)="onEvent($event)"
в обработчике событий, мы можем остановить распространение:
onEvent(event) {
event.stopPropagation();
}
Ответ 3
Вызов stopPropagation
в событии предотвращает распространение:
(event)="doSomething($event); $event.stopPropagation()"
Для preventDefault
просто верните false
(event)="doSomething($event); false"
Ответ 4
Добавление к ответу @AndroidUniversity. В одной строке вы можете записать ее так:
<component (click)="$event.stopPropagation()"></component>
Ответ 5
Если вы используете метод, связанный с событием, просто верните false:
@Component({
(...)
template: `
<a href="/test.html" (click)="doSomething()">Test</a>
`
})
export class MyComp {
doSomething() {
(...)
return false;
}
}
Ответ 6
Мне нужно было stopPropigation
и preventDefault
, чтобы кнопка не увеличивала элемент аккордеона, который он сидел выше.
Итак...
@Component({
template: `
<button (click)="doSomething($event); false">Test</button>
`
})
export class MyComponent {
doSomething(e) {
e.stopPropagation();
// do other stuff...
}
}
Ответ 7
Ничего не работало для IE (Internet Explorer). Мои тестеры смогли сломать мой модальный, щелкнув по всплывающему окну на кнопках за ним. Итак, я прослушал щелчок по моему модальному экрану и заставил перефокусироваться на всплывающей кнопке.
<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)
}
Ответ 8
Я только что проверил в приложении Angular 6, event.stopPropagation() работает с обработчиком событий, даже не передавая $ event
(click)="doSomething()" // does not require to pass $event
doSomething(){
// write any code here
event.stopPropagation();
}
Ответ 9
Отключить ссылку href с JavaScript
<a href="#" onclick="return yes_js_login();">link</a>
yes_js_login = function() {
// Your code here
return false;
}
Как это должно работать и в TypeScript с Angular (Моя версия: 4.1.2)
шаблон<a class="list-group-item list-group-item-action" (click)="employeesService.selectEmployeeFromList($event); false" [routerLinkActive]="['active']" [routerLink]="['/employees', 1]">
RouterLink
</a>
TypeScript
public selectEmployeeFromList(e) {
e.stopPropagation();
e.preventDefault();
console.log("This onClick method should prevent routerLink from executing.");
return false;
}
Но это не отключает выполнение routerLink!
Ответ 10
Добавление false после функции остановит распространение события
<a (click)="foo(); false">click with stop propagation</a>
Ответ 11
Это решило мою проблему, предупредив, что событие запускается детьми:
doSmth(){
// what ever
}
<div (click)="doSmth()">
<div (click)="$event.stopPropagation()">
<my-component></my-component>
</div>
</div>
Ответ 12
Попробуйте эту директиву
@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);
}
}
}
использование
<input
type="text"
stopPropagation="input" />
<input
type="text"
[stopPropagation]="['input', 'click']" />