วิธีที่ง่ายที่สุดในการหยุดการเผยแพร่กิจกรรมเมาส์ใน Angular 2 คืออะไร ฉันควรผ่าน$event
วัตถุพิเศษและเรียกstopPropagation()
ตัวเองหรือมีวิธีอื่น ตัวอย่างเช่นใน Meteor ฉันสามารถย้อนกลับfalse
จากตัวจัดการเหตุการณ์
วิธีที่ง่ายที่สุดในการหยุดการเผยแพร่กิจกรรมเมาส์ใน Angular 2 คืออะไร ฉันควรผ่าน$event
วัตถุพิเศษและเรียกstopPropagation()
ตัวเองหรือมีวิธีอื่น ตัวอย่างเช่นใน Meteor ฉันสามารถย้อนกลับfalse
จากตัวจัดการเหตุการณ์
คำตอบ:
หากคุณต้องการที่จะเพิ่มสิ่งนี้ไปยังองค์ประกอบใด ๆ โดยไม่ต้องคัดลอก / วางรหัสเดิมซ้ำแล้วซ้ำอีกคุณสามารถสั่งให้ทำเช่นนี้ได้ มันง่ายเหมือนด้านล่าง:
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>
@HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
ที่ง่ายที่สุดคือการโทรหยุดการแพร่กระจายบนตัวจัดการเหตุการณ์ $event
ใช้งานได้เหมือนกันใน Angular 2 และมีเหตุการณ์ต่อเนื่อง (โดยการคลิกเมาส์เหตุการณ์เมาส์ ฯลฯ ):
(click)="onEvent($event)"
ในตัวจัดการเหตุการณ์เราสามารถหยุดการแพร่กระจายได้:
onEvent(event) {
event.stopPropagation();
}
<button confirmMessage="are you sure?" (click)="delete()">Delete</button>
และในคำสั่งของฉัน: (click)="confirmAction($event)
จากนั้นconfirmAction(event) { event.stopPropagation(); }
;
event
ในฟังก์ชั่นการจัดการstopPropogation()
ไม่สามารถใช้ได้ ฉันต้องทำอย่างถูกต้องในมาร์กอัป: `(คลิก) =" foo (); $ event.stopPropogation () "
การโทรหาstopPropagation
เหตุการณ์ป้องกันการแพร่กระจาย:
(event)="doSomething($event); $event.stopPropagation()"
สำหรับpreventDefault
เพียงผลตอบแทนfalse
(event)="doSomething($event); false"
;
ที่สิ้นสุดแม้ว่า ฉันจะเปลี่ยนสิ่งนั้น
false
<3
การเพิ่มคำตอบจาก @AndroidUniversity ในบรรทัดเดียวคุณสามารถเขียนได้เช่น:
<component (click)="$event.stopPropagation()"></component>
หากคุณอยู่ในเมธอดที่ผูกกับเหตุการณ์
@Component({
(...)
template: `
<a href="https://stackoverflow.com/test.html" (click)="doSomething()">Test</a>
`
})
export class MyComp {
doSomething() {
(...)
return false;
}
}
false
โทรไม่ได้preventDefault
stopPropagation
preventDefault
เรียกว่า github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
สิ่งนี้ใช้ได้กับฉัน:
mycomponent.component.ts:
action(event): void {
event.stopPropagation();
}
mycomponent.component.html:
<button mat-icon-button (click)="action($event);false">Click me !<button/>
ฉันต้องstopPropigation
และpreventDefault
เพื่อป้องกันไม่ให้ปุ่มขยายรายการหีบเพลงที่มันนั่งอยู่ด้านบน
ดังนั้น...
@Component({
template: `
<button (click)="doSomething($event); false">Test</button>
`
})
export class MyComponent {
doSomething(e) {
e.stopPropagation();
// do other stuff...
}
}
ไม่มีอะไรทำงานได้กับ IE (Internet Explorer) ผู้ทดสอบของฉันสามารถทำลายคำกริยาของฉันได้โดยคลิกที่หน้าต่างป๊อปอัปที่ปุ่มด้านหลัง ดังนั้นฉันจึงฟังการคลิกบนหน้าจอ mod ของฉันและบังคับให้ทำการรีโฟกัสบนปุ่มป๊อปอัพ
<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)
}
ฉันใช้
<... (click)="..;..; ..someOtherFunctions(mybesomevalue); $event.stopPropagation();" ...>...
ในระยะสั้นเพียงแค่แยกสิ่งอื่น ๆ / ฟังก์ชั่นการโทรด้วย ';' และเพิ่ม $ event.stopPropagation ()
ฉันเพิ่งตรวจสอบในแอปพลิเคชัน Angular 6, event.stopPropagation () ทำงานกับตัวจัดการเหตุการณ์โดยไม่ต้องผ่าน $ 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;
}
แต่มันไม่ได้ปิดการใช้งานการทำงานของ routerLink!
การเพิ่ม false หลังจากฟังก์ชันจะหยุดการเผยแพร่เหตุการณ์
<a (click)="foo(); false">click with stop propagation</a>
วิธีนี้แก้ไขปัญหาของฉันจากการป้องกันไม่ให้เหตุการณ์ถูกไล่ออกโดยเด็ก:
doSmth(){
// what ever
}
<div (click)="doSmth()">
<div (click)="$event.stopPropagation()">
<my-component></my-component>
</div>
</div>
ลองใช้คำสั่งนี้
@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);
}
}
}
การใช้
<input
type="text"
stopPropagation="input" />
<input
type="text"
[stopPropagation]="['input', 'click']" />