답변:
동일한 코드를 반복해서 복사 / 붙여 넣지 않고도 요소에 이것을 추가하고 싶을 경우, 지시를 내릴 수 있습니다. 다음과 같이 간단합니다.
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']" />