我有一个服务:
import { EventEmitter, Injectable } from '@angular/core';
@Injectable()
export class PingOnActionListenerService {
removingListener = new EventEmitter();
removeListener(): void {
this.removingListener.emit();
}
在组件A,我调用该服务:
this._pingOnActionListenerService.removeListener();
在组件B,我想听服务:
ngOnInit() {
this._pingOnActionListenerService.removingListener.subscribe(this.deactivatelistener());
}
deactivatelistener() {
window.removeEventListener('click', this.pingIfLastPingIsOld);
}
当我运行此代码时,我在控制台上收到错误消息:
core.js:1671 ERROR TypeError:generatorOrNext不是SafeSubscriber.schedulerFn [as _next](core.js:3565)的函数,位于SafeSubscriber.push ../ node_modules / rxjs / _esm5 / internal / Subscriber.js.SafeSubscriber .__ tryOrUnsub (Subscriber.js:195)在Subscriber.push ../ node_modules / rxjs / _esm5 / internal的SafeSubscriber.push ../ node_modules / rxjs / _esm5 / internal / Subscriber.js.SafeSubscriber.next(Subscriber.js:133) /Subscriber.js.Subscriber._next(Subscriber.js:77)位于EventEmitter.push的Subscriber.push ../ node_modules / rxjs / _esm5 / internal / Subscriber.js.Subscriber.next(Subscriber.js:54)。 /Eode_modules/rxjs/_esm5/internal/Subject.js.Subject.next(Subject.js:47)at EventEmitter.push ../ node_modules/@angular/core/fesm5/core.js.EventEmitter.emit(core.js :3537)在PingOnActionListenerService.push ../ src / app / core / services / ping-on-action / ping-on-action-listener.service.ts.PingOnActionListenerService.removeListener(ping-on-action-listener.service。 ts:19)在CatchSubscriber.selector(logging-interceptor.ts:45)在CatchSubscriber.push ../ node_modules / rxjs / _esm5 / internal / operators / catchError.js.CatchSubscriber.error(catchError.js:33)
您不应该在Service中使用EventEmitter
,它应该仅用于组件绑定和@Output()
。你应该重新设计为Subject/Observable
:
export class PingOnActionListenerService {
_removingListener = new BehaviorSubject<boolean>(false);
removeListener(): void {
this._removingListener.next(true);
}
get removeListener$(): Observable<boolean> {
return this._removingListener.asObservable()
.pipe(filter(val => val));
}
}
在组件B中使用:
ngOnInit() {
this._pingOnActionListenerService.removeListener$
.subscribe(() => {
this.deactivatelistener();
});
}
不要忘记取消订阅组件ngOnDestroy
。