Angular Renderer2 删除侦听器
Angular Renderer2 remove listener
是否可以使用新的 angular 4 渲染器删除侦听器?
这是界面:
abstract listen(target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void): () => void;
renderer v1 listen 和 listenGlobal returns 一个函数,但是这个 returns void.
有问题吗?如果没有,我怎样才能删除监听器?
与Renderer
没有区别:
import { Renderer2 } from '@angular/core';
export class MyComponent {
listenerFn: () => void;
constructor(private renderer: Renderer2) {}
ngOnInit() {
this.listenerFn = this.renderer.listen(document, 'mousemove', () => console.log('move'));
}
ngOnDestroy() {
if (this.listenerFn) {
this.listenerFn();
}
}
}
您还可以使用 rxjs 中的 fromEventPattern
函数。
private createOnClickObservable(renderer: Renderer2) {
let removeClickEventListener: () => void;
const createClickEventListener = (
handler: (e: Event) => boolean | void
) => {
removeClickEventListener = renderer.listen("document", "click", handler);
};
this.onClick$ = fromEventPattern<Event>(createClickEventListener, () =>
removeClickEventListener()
).pipe(takeUntil(this._destroy$));
}
只是 use/subscribe 正如预期的那样
myMouseService.onClick$.subscribe((e: Event) => {
console.log("CLICK", e);
});
不要担心销毁,它会在关闭 observable 期间由 rxjs 处理!
现场演示:https://stackblitz.com/edit/angular-so4?file=src%2Fapp%2Fmy-mouse.service.ts
查看另一个答案,探索更多细节:
将 Renderer.listen 处理程序的结果放在变量中更容易:
listener: any;
this.listener = this.renderer.listen('body', 'mousemove', (event) => {
console.log(event);
});
并且当取消事件发生时,用空参数调用变量
this.renderer.listen('body', 'mouseup', (event) => {
this.listener();
});
是否可以使用新的 angular 4 渲染器删除侦听器?
这是界面:
abstract listen(target: 'window' | 'document' | 'body' | any, eventName: string, callback: (event: any) => boolean | void): () => void;
renderer v1 listen 和 listenGlobal returns 一个函数,但是这个 returns void.
有问题吗?如果没有,我怎样才能删除监听器?
与Renderer
没有区别:
import { Renderer2 } from '@angular/core';
export class MyComponent {
listenerFn: () => void;
constructor(private renderer: Renderer2) {}
ngOnInit() {
this.listenerFn = this.renderer.listen(document, 'mousemove', () => console.log('move'));
}
ngOnDestroy() {
if (this.listenerFn) {
this.listenerFn();
}
}
}
您还可以使用 rxjs 中的 fromEventPattern
函数。
private createOnClickObservable(renderer: Renderer2) {
let removeClickEventListener: () => void;
const createClickEventListener = (
handler: (e: Event) => boolean | void
) => {
removeClickEventListener = renderer.listen("document", "click", handler);
};
this.onClick$ = fromEventPattern<Event>(createClickEventListener, () =>
removeClickEventListener()
).pipe(takeUntil(this._destroy$));
}
只是 use/subscribe 正如预期的那样
myMouseService.onClick$.subscribe((e: Event) => {
console.log("CLICK", e);
});
不要担心销毁,它会在关闭 observable 期间由 rxjs 处理!
现场演示:https://stackblitz.com/edit/angular-so4?file=src%2Fapp%2Fmy-mouse.service.ts
查看另一个答案,探索更多细节:
将 Renderer.listen 处理程序的结果放在变量中更容易:
listener: any;
this.listener = this.renderer.listen('body', 'mousemove', (event) => {
console.log(event);
});
并且当取消事件发生时,用空参数调用变量
this.renderer.listen('body', 'mouseup', (event) => {
this.listener();
});