2016-12-08 27 views
1

我对Angular2/RXJS的observables在订阅时如何工作有一个大体的了解,但我在某处犯了一个错误。Angular2组件订阅不正确的实现

在我的服务我有一个观察的可像这样:

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

我订阅了可观测和轨道父组件其子女对其作出的更改

constructor(private objectService: ObjectService) { 
    objectService.objectDetails$.subscribe(o => this.object = o); 
} 

Then the co mponent告诉应用程序它想要观察哪个对象:

ngOnInit() { 
     this.loadObjectDetails(); 
    } 

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

这到目前为止都是可以的。问题是当子组件订阅父对象观察到:

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

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

当父变化是观察对象,孩子被打与先前已代替观察刚刚过去的一个的每个对象。所以在这个孩子的情况下,如果父母已经观察到3个对象this.getHeaders()在孩子订阅时被调用3次。

我已经试过移动孩子的方法来订阅的完整部分:

() => this.getHeaders() 

但它从来没有被击中。

我已经尝试将ngOnInit()中的父订阅和在ngDestroy()中取消订阅,但它无法订阅类似的东西。

任何关于如何调整我如何去做这件事的建议都会很棒。

我希望这是有道理的,在此先感谢。

+0

我不确定值是否存在于构造函数或ngInit ....我一直在做的是创建一个方法GetMyObservable(),它返回observable,我订阅该方法....奇迹般有效。不知道这是否是你的问题。 –

+0

感谢John的建议,这看起来像我订阅作品的方式,但我实际上并不想要订阅。我想我需要一些东西来给我一个可观察的快照,像.last() – Mark

回答