page navigationend cambiar angular dom-events event-propagation

navigationend - title angular 6



Detener la propagaciĆ³n de eventos del mouse (13)

Deshabilitar enlace href con JavaScript

<a href="#" onclick="return yes_js_login();">link</a> yes_js_login = function() { // Your code here return false; }

Cómo debería funcionar también en TypeScript con Angular (Mi versión: 4.1.2)

Modelo

<a class="list-group-item list-group-item-action" (click)="employeesService.selectEmployeeFromList($event); false" [routerLinkActive]="[''active'']" [routerLink]="[''/employees'', 1]"> RouterLink </a> Mecanografiado

public selectEmployeeFromList(e) { e.stopPropagation(); e.preventDefault(); console.log("This onClick method should prevent routerLink from executing."); return false; }

¡Pero no deshabilita la ejecución de routerLink!

¿Cuál es la forma más fácil de detener la propagación de eventos del mouse en Angular 2? ¿Debo pasar el objeto especial $event y llamar a stopPropagation() yo mismo o de alguna otra manera. Por ejemplo, en Meteor, simplemente puedo devolver false desde el controlador de eventos.


Acabo de registrar una aplicación de Angular 6, event.stopPropagation () funciona en un controlador de eventos sin siquiera pasar $ event

(click)="doSomething()" // does not require to pass $event doSomething(){ // write any code here event.stopPropagation(); }


Agregando a la respuesta de @AndroidUniversity. En una sola línea puedes escribirlo así:

<component (click)="$event.stopPropagation()"></component>


Agregar falso después de la función detendrá la propagación de eventos

<a (click)="foo(); false">click with stop propagation</a>


Esto resolvió mi problema, evitando que un evento sea disparado por un niño:

doSmth(){ // what ever }

<div (click)="doSmth()"> <div (click)="$event.stopPropagation()"> <my-component></my-component> </div> </div>


Llamar a stopPropagation en el evento evita la propagación:

(event)="doSomething($event); $event.stopPropagation()"

Para preventDefault solo devuelve false

(event)="doSomething($event); false"


Lo más simple es llamar a detener la propagación en un controlador de eventos. $event funciona igual en Angular 2, y contiene el evento en curso (mediante un clic del mouse, evento del mouse, etc.):

(click)="onEvent($event)"

en el controlador de eventos, podemos detener la propagación:

onEvent(event) { event.stopPropagation(); }


Nada funcionó para IE (Internet Explorer). Mis probadores pudieron romper mi modal haciendo clic en la ventana emergente en los botones detrás de él. Entonces, escuché un clic en mi div de pantalla modal y forcé a volver a enfocar un botón emergente.

<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) }


Prueba esta directiva

@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); } } }

Uso

<input type="text" stopPropagation="input" /> <input type="text" [stopPropagation]="[''input'', ''click'']" />


Si desea poder agregar esto a cualquier elemento sin tener que copiar / pegar el mismo código una y otra vez, puede hacer una directiva para hacerlo. Es tan simple como a continuación:

import {Directive, HostListener} from "@angular/core"; @Directive({ selector: "[click-stop-propagation]" }) export class ClickStopPropagation { @HostListener("click", ["$event"]) public onClick(event: any): void { event.stopPropagation(); } }

Luego solo agrégalo al elemento en el que lo quieres:

<div click-stop-propagation>Stop Propagation</div>


Si está en un método vinculado a un evento, simplemente devuelva falso:

@Component({ (...) template: ` <a href="/test.html" (click)="doSomething()">Test</a> ` }) export class MyComp { doSomething() { (...) return false; } }


Tuve que stopPropigation y preventDefault para evitar que un botón expandiera un elemento de acordeón que estaba encima.

Asi que...

@Component({ template: ` <button (click)="doSomething($event); false">Test</button> ` }) export class MyComponent { doSomething(e) { e.stopPropagation(); // do other stuff... } }


esto funcionó para mí: mycomponent.component.ts:

action(event): void { event.stopPropagation(); }

mycomponent.component.ts:

<button mat-icon-button (click)="action($event);false">Click me !<button/>