如何在整个 Angular 应用程序中使用实例服务?
How to use on instance service in whole Angular app?
我有以下发出事件的服务:
import { Subject, Observable } from "rxjs";
import { Injectable } from "@angular/core";
@Injectable({
providedIn: "root"
})
export class TabEvents {
private routeParameters: Subject<any> = new Subject();
listenRouteParameters(): Observable<any> {
return this.routeParameters.asObservable();
}
emitRouteParmeters(parameters: any) {
this.routeParameters.next(parameters);
}
}
为什么每次打开监听事件的组件时:
this.tabEvents.listenRouteParameters().subscribe(parameters => {
// get event
})
调用了两次?然后三次?
似乎每次组件创建订阅者,但不取消订阅。为什么组件被销毁了?
Observer 是否在单独的线程中工作?
当您的组件被销毁时,您需要以某种方式取消订阅可观察对象。例如:
private _routeParamsSub : Subscription;
this._routeParamsSub = this.tabEvents.listenRouteParameters().subscribe(parameters => {
// get event
})
ngOnDestroy() {
this._routeParamsSub.unsubscribe()
}
您可以尝试的另一种方法是使用 takeUntil
private _destroyed$: Subject<null> = new Subject();
this.tabEvents.listenRouteParameters()
.pipe(
takeUntil(this._destroyed$)
)
.subscribe(parameters => {
// get event
})
ngOnDestroy() {
this._destroyed$.next();
this._destroyed$.complete();
}
最终结果是一样的,但如果您有多个订阅并且不会为每个订阅创建一个订阅变量,或者一个数组来保存所有订阅,您可能会发现后者更有用。
我有以下发出事件的服务:
import { Subject, Observable } from "rxjs";
import { Injectable } from "@angular/core";
@Injectable({
providedIn: "root"
})
export class TabEvents {
private routeParameters: Subject<any> = new Subject();
listenRouteParameters(): Observable<any> {
return this.routeParameters.asObservable();
}
emitRouteParmeters(parameters: any) {
this.routeParameters.next(parameters);
}
}
为什么每次打开监听事件的组件时:
this.tabEvents.listenRouteParameters().subscribe(parameters => {
// get event
})
调用了两次?然后三次?
似乎每次组件创建订阅者,但不取消订阅。为什么组件被销毁了?
Observer 是否在单独的线程中工作?
当您的组件被销毁时,您需要以某种方式取消订阅可观察对象。例如:
private _routeParamsSub : Subscription;
this._routeParamsSub = this.tabEvents.listenRouteParameters().subscribe(parameters => {
// get event
})
ngOnDestroy() {
this._routeParamsSub.unsubscribe()
}
您可以尝试的另一种方法是使用 takeUntil
private _destroyed$: Subject<null> = new Subject();
this.tabEvents.listenRouteParameters()
.pipe(
takeUntil(this._destroyed$)
)
.subscribe(parameters => {
// get event
})
ngOnDestroy() {
this._destroyed$.next();
this._destroyed$.complete();
}
最终结果是一样的,但如果您有多个订阅并且不会为每个订阅创建一个订阅变量,或者一个数组来保存所有订阅,您可能会发现后者更有用。