我该如何在Angular 2中绑定渲染元素的事件监听器?
我正在使用 Dragula 拖放库。它创建动态 HTML,但我的事件未绑定到动态HTML元素。
我该如何在Angular 2中绑定渲染元素的事件监听器?
我正在使用 Dragula 拖放库。它创建动态 HTML,但我的事件未绑定到动态HTML元素。
import { AfterViewInit, Component, ElementRef} from '@angular/core';
constructor(private elementRef:ElementRef) {}
ngAfterViewInit() {
this.elementRef.nativeElement.querySelector('my-element')
.addEventListener('click', this.onClick.bind(this));
}
onClick(event) {
console.log(event);
}
.removeEventListener()
),还是 Angular 会自行处理? - kraftwer1bind
的内容在 onClick() { ... }
被调用时将作为 this
可用,因此基本上可以传递任何对象。 - Günter Zöchbauer<div id="my-element">
,则应该写成 '#my-element'
。 - Mike Pooleimplements AfterViewInit
。 - tblev例子:listen(target: 'window'|'document'|'body'|any, eventName: string, callback: (event: any) => boolean | void): () => void
export class ListenDemo implements AfterViewInit {
@ViewChild('testElement')
private testElement: ElementRef;
globalInstance: any;
constructor(private renderer: Renderer2) {
}
ngAfterViewInit() {
this.globalInstance = this.renderer.listen(this.testElement.nativeElement, 'click', () => {
this.renderer.setStyle(this.testElement.nativeElement, 'color', 'green');
});
}
}
注意:
当您使用此方法向dom元素添加事件监听器时,应在组件被销毁时删除此事件监听器
您可以这样做:
ngOnDestroy() {
this.globalInstance();
}
在这种方法中使用ElementRef
的方式不应该让你的Angular应用程序面临安全风险。了解更多信息,请参考ElementRef security risk angular 2。
this.renderer.listen
:globalInstance=this.renderer.listen ...
然后在ngOnDestroy()
中调用它:{this.globalInstance();}
- HDJEMAI#testElement
添加到渲染的元素中,而该元素不在我们的控制范围内? - stack247HostListener 应该是将事件绑定到组件的适当方式:
@Component({
selector: 'your-element'
})
export class YourElement {
@HostListener('click', ['$event']) onClick(event) {
console.log('component is clicked');
console.log(event);
}
}
如果您想为渲染的DOM元素中具有相同类的所有元素绑定像“click”这样的事件,则可以使用components.ts文件中以下代码部分设置事件监听器。
import { Component, OnInit, Renderer, ElementRef} from '@angular/core';
constructor( elementRef: ElementRef, renderer: Renderer) {
dragulaService.drop.subscribe((value) => {
this.onDrop(value.slice(1));
});
}
public onDrop(args) {
let [e, el] = args;
this.toggleClassComTitle(e,'checked');
}
public toggleClassComTitle(el: any, name: string) {
el.querySelectorAll('.com-item-title-anchor').forEach( function ( item ) {
item.addEventListener('click', function(event) {
console.log("item-clicked");
});
});
}
@HostListener('window:click', ['$event']) onClick(event){ }
这个例子将帮助您添加事件监听器和与触摸相关的滑动手势。
import { Component, HostListener, Input, OnInit } from '@angular/core';
export class AppbarComponent implements OnInit {
touchstartX:number = 0;
touchstartY:number = 0;
touchendX:number = 0;
touchendY:number = 0;
@HostListener('touchstart', ['$event']) gesuredZonestart(event:any) {
this.touchstartX = event.changedTouches[0].screenX;
this.touchstartY = event.changedTouches[0].screenY;
}
@HostListener('touchend', ['$event']) gesuredZoneend(event:any) {
this.touchendX = event.changedTouches[0].screenX;
this.touchendY = event.changedTouches[0].screenY;
this.handleGesure();
}
handleGesure() {
var swiped = 'swiped: ';
if (this.touchendX < this.touchstartX) {
console.log(swiped + 'left!');
}
if (this.touchendX > this.touchstartX) {
console.log(swiped + 'right!');
}
if (this.touchendY < this.touchstartY) {
console.log(swiped + 'down!');
}
if (this.touchendY > this.touchstartY) {
console.log(swiped + 'top!');
}
if (this.touchendY == this.touchstartY) {
console.log('tap!');
}
}
}
import { Component, OnInit } from '@angular/core';
在组件内创建变量:
onlineStatus: any;
ngOnInit(): void {
const updateNetworkStatus = () => {
const text = window.navigator.onLine ? ' online' : ' offline'
this.onlineStatus = text
}
updateNetworkStatus()
window.addEventListener('offline', updateNetworkStatus)
window.addEventListener('online', updateNetworkStatus)
}
有一种很好的方法可以检测Angular中的子元素何时被渲染并访问它。
我在Stack Overflow上找到了这个方法,但不记得在哪里了。
private myElement: ElementRef;
@ViewChild('mySelector', {static : false}) set content(content: ElementRef) {
if(content) { // initially setter gets called with undefined
// debugger;
this.myElement = content;
}
}
<div #mySelector *ngIf="initiallyFalseThenAfterDbResponseIsTrue"></div>