回答:
同じコードを何度もコピー/貼り付けすることなく、これを要素に追加できるようにしたい場合は、これを行うためのディレクティブを作成できます。以下のように簡単です:
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()
で処理するまでには利用できないようです。私はマークアップでそれを正しくしなければなりませんでした: `(click)=" foo(); $ event.stopPropogation() "
stopPropagation
イベントを呼び出すと、伝播が妨げられます。
(event)="doSomething($event); $event.stopPropagation()"
以下のためpreventDefault
だけのリターンfalse
(event)="doSomething($event); false"
;
ただし、最後にはありません。変更します。
false
<3
イベントにバインドされたメソッドにいる場合は、単にfalseを返します。
@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)では何も機能しませんでした。テスターは、背後にあるボタンのポップアップウィンドウをオフにして、モーダルを壊すことができました。そのため、モーダル画面のdivのクリックをリッスンし、ポップアップボタンを強制的に再フォーカスしました。
<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)
}
<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;
}
しかし、それはrouterLinkの実行を無効にしません!
このディレクティブを試す
@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']" />