Angular 如何在整个应用程序中使用实例服务?

Angular 如何在整个应用程序中使用实例服务?,angular,angular7,angular8,Angular,Angular7,Angular8,我有以下发出事件的服务: import { Subject, Observable } from "rxjs"; import { Injectable } from "@angular/core"; @Injectable({ providedIn: "root" }) export class TabEvents { private routeParameters: Subject<any> = new Subject(); listenRouteParamete

我有以下发出事件的服务:

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);
  }
}
它叫了两次?然后三次

似乎每个组件都创建了订阅服务器,但没有取消订阅。为什么组件被破坏了


观察者是否在独立线程中工作?

当您的组件被销毁时,您需要以某种方式取消对观察者的订阅。例如:

private _routeParamsSub : Subscription;

this._routeParamsSub = this.tabEvents.listenRouteParameters().subscribe(parameters => {
   // get event
})

ngOnDestroy() {
    this._routeParamsSub.unsubscribe()
}
您可以尝试的另一种方法是使用takeUntil


最终的结果是相同的,但是如果您有多个订阅,并且不想为每个订阅创建订阅变量,您可能会发现后者更有用,或者一个数组来保存所有订阅。

如果我调用服务中的下一个观察者而不是组件,我可以放弃观察者吗?@user3573738您将此代码放入订阅ListenRouteParameters的每个组件中。除非您取消订阅调用完成,否则您的订阅可能会持续超过组件的生存期。您可能希望查看可管道操作符take1,它接收第一个事件,然后完成。每当调用observable next时,所有观察者都会调用三个next中的next,error,complete函数回调,因此会调用多个调用
private _routeParamsSub : Subscription;

this._routeParamsSub = this.tabEvents.listenRouteParameters().subscribe(parameters => {
   // get event
})

ngOnDestroy() {
    this._routeParamsSub.unsubscribe()
}
private _destroyed$: Subject<null> = new Subject();

this.tabEvents.listenRouteParameters()
    .pipe(
        takeUntil(this._destroyed$)
    )
    .subscribe(parameters => {
        // get event
    })

ngOnDestroy() {
    this._destroyed$.next();
    this._destroyed$.complete();
}