@ngrx - 将商店查询链接到 BehaviorSubject

@ngrx - linking store query to BehaviorSubject

我有很多 Reducer 查询需要 Link 直到行为主题。目前我正在为每个人做这件事!

有没有更简洁的表达方式?

this._higherCurveObservable = this.store.let(getCurveSummaryForInstrumentTimeframe(this._instrument, this._timeframe.Code));
this._higherCurveSubject = <BehaviorSubject<CurveSummary>>new BehaviorSubject(null).distinctUntilChanged();
this._higherCurveSubscription = this._higherCurveObservable.subscribe(x => this._higherCurveSubject.next(x));
this._higherCurveSubject.subscribe(x => this.higherCurveChange(x));

应该不需要创建单独的 BehaviourSubjects,您可以只根据商店流创建所需的 Observables

(唯一一次你需要这样的东西——我不假设你这样做了——当你试图滥用 BehaviourSubject 以便能够从中获取数据时就是这种情况商店以及从侧面分派数据,在这种情况下,您应该重新考虑架构,因为这将违背 ngrx 拥有单一中央商店的概念.)

所以有多种方法可以用更少的开销来编写它。


示例 1:永远不会取消订阅的永久订阅(例如在服务中)

this.store
    .let(getCurveSummaryForInstrumentTimeframe(this._instrument, this._timeframe.Code))
    .distinctUntilChanged()
    .do(x => this.higherCurveChange(x))
    .subscribe();

示例2:一个临时订阅,应该在特定时间点取消订阅(例如在Component中,当Component被销毁时应该取消订阅)

const higherCurve$: Observable<CurveSummary> = this.store
    .let(getCurveSummaryForInstrumentTimeframe(this._instrument, this._timeframe.Code))
    .distinctUntilChanged();
this._higherCurveSubscription = higherCurve$.subscribe(x => this.higherCurveChange(x));

// ... some time later
this._higherCurveSubscription.unsubscribe();