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

时间:2019-09-02 08:02:23

标签: 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();

  listenRouteParameters(): Observable<any> {
    return this.routeParameters.asObservable();
  }

  emitRouteParmeters(parameters: any) {
    this.routeParameters.next(parameters);
  }
}

为什么每次打开组件时都会监听事件:

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

它叫两次?然后三次?

似乎每次组件都会创建订阅者,但不会取消订阅。为什么要破坏组件?

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

1 个答案:

答案 0 :(得分:3)

当组件被销毁时,您需要以某种方式退订可观察对象。例如:

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();
}

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