【发布时间】:2021-11-04 12:11:31
【问题描述】:
按照缓存服务模式,我使用BehaviourSubject 订阅,通过使用在各种组件中创建的只读Observable 订阅
// credential.service.ts
private _credentialList$: BehaviorSubject<Credential[]>
readonly credentialListObv$: Observable<Credential[]>
...
this. credentialListObv$ = this.credentialList$.asObservable()
...
getCredentialList(...): Observable<Credential[]> {
return this.http.get<Credential[]>(
``
).pipe(
tap(credList => {
...
this._credentialList$.next(credList)
}),
)
}
因此,我从组件触发getCredentialList 方法以发出_credentialList$ 主题获取的列表,因此credentialListObv$ 的所有订阅者都应该获得该值。
问题是,当我创建我的组件时,当我调用 getCredentialList 方法时会收到不需要的订阅
// credential-list.component.ts
private _credentials$: Observable<Credential[]>
constructor(
private credentialService: CredentialService,
) {
this._credentials$ = this.credentialService.credentialListObv$.pipe(
tap(() => {console.log("sub")}),
...
)
}
ngAfterViewInit(): void {
this.credentialService.getCredentialList(...).subscribe()
}
get credentials$() {
return this._credentials$
}
// credential-list.component.html
<mat-expansion-panel *ngFor="let credential of credentials$ | async; let i=index">
...
结果是当我访问页面"sub"时会打印两次。第一个订阅发生在组件模板内的 async 管道中,但是如果我永远不会从 credential-list 组件调用 subscribe 上的 subscribe,为什么还有另一个订阅呢?
【问题讨论】:
标签: angular typescript rxjs angular-services behaviorsubject