我对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()中取消订阅,但它无法订阅类似的东西。
任何关于如何调整我如何去做这件事的建议都会很棒。
我希望这是有道理的,在此先感谢。
我不确定值是否存在于构造函数或ngInit ....我一直在做的是创建一个方法GetMyObservable(),它返回observable,我订阅该方法....奇迹般有效。不知道这是否是你的问题。 –
感谢John的建议,这看起来像我订阅作品的方式,但我实际上并不想要订阅。我想我需要一些东西来给我一个可观察的快照,像.last() – Mark