Câu trả lời:
Nếu bạn muốn có thể thêm phần này vào bất kỳ phần tử nào mà không phải sao chép / dán cùng một mã nhiều lần, bạn có thể tạo một lệnh để làm điều này. Nó đơn giản như dưới đây:
import {Directive, HostListener} from "@angular/core";
@Directive({
selector: "[click-stop-propagation]"
})
export class ClickStopPropagation
{
@HostListener("click", ["$event"])
public onClick(event: any): void
{
event.stopPropagation();
}
}
Sau đó, chỉ cần thêm nó vào phần tử bạn muốn:
<div click-stop-propagation>Stop Propagation</div>
@HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
Đơn giản nhất là gọi lan truyền dừng trên một trình xử lý sự kiện. $event
hoạt động tương tự trong Angular 2 và chứa sự kiện đang diễn ra (bằng cách nhấp chuột, sự kiện chuột, v.v.):
(click)="onEvent($event)"
trên bộ xử lý sự kiện, chúng ta có thể dừng việc truyền bá:
onEvent(event) {
event.stopPropagation();
}
<button confirmMessage="are you sure?" (click)="delete()">Delete</button>
và trong chỉ thị của tôi : (click)="confirmAction($event)
, sau đó confirmAction(event) { event.stopPropagation(); }
;
event
lý chức năng xử lý stopPropogation()
không khả dụng. Tôi phải làm điều đó đúng trong đánh dấu: `(nhấp chuột) = "foo (); $ event.stopPropogation ()"
Kêu gọi stopPropagation
sự kiện này ngăn cản sự lan truyền:
(event)="doSomething($event); $event.stopPropagation()"
Để preventDefault
trở vềfalse
(event)="doSomething($event); false"
;
cuối cùng mặc dù. Tôi sẽ thay đổi điều đó.
false
<3
Thêm vào câu trả lời từ @AndroidUniversity. Trong một dòng duy nhất bạn có thể viết nó như vậy:
<component (click)="$event.stopPropagation()"></component>
Nếu bạn đang ở trong một phương thức bị ràng buộc với một sự kiện, chỉ cần trả về false:
@Component({
(...)
template: `
<a href="https://stackoverflow.com/test.html" (click)="doSomething()">Test</a>
`
})
export class MyComp {
doSomething() {
(...)
return false;
}
}
false
Gọi lại preventDefault
không được stopPropagation
.
preventDefault
được gọi. github.com/angular/angular/blob/ cường , github.com/angular/angular/blob/
Điều này làm việc cho tôi:
mycomponent.component.ts:
action(event): void {
event.stopPropagation();
}
mycomponent.component.html:
<button mat-icon-button (click)="action($event);false">Click me !<button/>
Tôi đã phải stopPropigation
và preventDefault
để ngăn một nút mở rộng một vật phẩm accordion mà nó ngồi phía trên.
Vì thế...
@Component({
template: `
<button (click)="doSomething($event); false">Test</button>
`
})
export class MyComponent {
doSomething(e) {
e.stopPropagation();
// do other stuff...
}
}
Không có gì hoạt động cho IE (Internet Explorer). Những người thử nghiệm của tôi đã có thể phá vỡ phương thức của tôi bằng cách nhấp vào cửa sổ bật lên trên các nút phía sau nó. Vì vậy, tôi đã nghe một nhấp chuột vào div màn hình phương thức của mình và buộc phải tập trung vào một nút bật lên.
<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)
}
Tôi vừa kiểm tra trong một ứng dụng Angular 6, event.stopPropagation () hoạt động trên một trình xử lý sự kiện mà không vượt qua $ 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>
TypeScript
public selectEmployeeFromList(e) {
e.stopPropagation();
e.preventDefault();
console.log("This onClick method should prevent routerLink from executing.");
return false;
}
Nhưng nó không vô hiệu hóa việc thực thi bộ định tuyến!
Thêm false sau chức năng sẽ dừng lan truyền sự kiện
<a (click)="foo(); false">click with stop propagation</a>
Điều này đã giải quyết vấn đề của tôi, từ việc ngăn chặn rằng một sự kiện bị trẻ em sa thải:
doSmth(){
// what ever
}
<div (click)="doSmth()">
<div (click)="$event.stopPropagation()">
<my-component></my-component>
</div>
</div>
Hãy thử chỉ thị này
@Directive({
selector: '[stopPropagation]'
})
export class StopPropagationDirective 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);
}
}
}
Sử dụng
<input
type="text"
stopPropagation="input" />
<input
type="text"
[stopPropagation]="['input', 'click']" />