Angular2 组件订阅不正确的实现

Angular2 Component subscription incorrect implementation

我大致了解 Angular2/RXJS 可观察对象在订阅时的工作方式,但我在某处犯了错误。

在我的服务中,我有一个可用的 observable,如下所示:

    // Source
    private objectDetailsCache = new Subject<ObectDetails>();
    // Stream
    public objectDetails$ = this.objectDetailsCache.asObservable().cache();

服务使用这些方法操作可观察对象:

    updateObject(object: ObjectDetails): Observable<ObjectDetails> {

    let objectMapped = this.mappingService.mapObjectDetailsToObject(object);

    this._HTTPService.update(this._objectUrl + object.id, objectMapped)
        .subscribe(o => {
            this.objectDetailsCache.next(o);
        });
    return this.objectDetails$.last();
    }

    getObjectDetails(id: number): Observable<ObjectDetails> {
    this._HTTPService.get(this._objectUrl + id + '/details')
        .subscribe(o => {
            this.objectDetailsCache.next(o);
        })
    return this.objectDetails$.last();
    }

我有一个 parent 组件,它订阅了 observable 并跟踪它的 children

对其所做的更改
    constructor(private objectService: ObjectService) {
    objectService.objectDetails$.subscribe(o => this.object = o);
}

然后组件告诉应用程序它想要观察哪个object:

    ngOnInit() {
        this.loadObjectDetails();
    }

    loadObjectDetails() {
        this.sub = this.route.params.subscribe(params => {
            let id = +params['id'];
            this.objectService.getObjectDetails(id)
                .subscribe(
                o => {  },
                error => { });
        });
     }

到目前为止一切正常。当 child 组件订阅 parent 的 object observable 时,问题就来了:

    ngOnInit() {
       this.sub = this.objectService.objectDetails$.subscribe(
            o => {
                this.object = o;
                this.getHeaders()
            }
       );
    }

    ngOnDestroy(){
        this.sub.unsubscribe();
    }

当 parent 改变它正在观察的 object 时,child 会被之前观察到的每个 object 击中,而不仅仅是最后一个。所以在这个 child 的情况下,如果 parent 观察到 3 objects this.getHeaders() 在 child 订阅时被调用 3 次。

我尝试将 child 方法移动到订阅的完整部分:

() => this.getHeaders()

但它永远不会被击中。

我试过将 parent 订阅放在 ngOnInit() 中,然后在 ngDestroy() 中取消订阅,但它无法订阅任何类似的东西。

任何关于我如何调整我的处理方式的建议都会很棒。

我希望这是有道理的,提前致谢。

我能够使用 RXJS 库中的 BehviourSubject 解决这个问题:

https://xgrommx.github.io/rx-book/content/subjects/behavior_subject/index.html

特别是 .getValue() 成员 returns 可观察流中的最后一个对象。因此,与其让子组件订阅可观察对象,不如让它们只请求最新的值。这样,当他们更新可观察到的蒸汽时,他们不会自行回收。