У меня есть общее представление о том, как работают наблюдаемые Angular2/RXJS, когда они подписаны, но я что-то делаю с ошибкой.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);
}
Затем 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(), который возвращает наблюдаемый, и я подписываюсь на этот метод .... работает как шарм. Не знаю, это ваша проблема или нет. –
спасибо за совет Джон, мне кажется, что я подписываюсь на работы, но на самом деле я не хочу подписки. Я думаю, мне нужно что-то, чтобы дать мне снимок наблюдаемого, что-то вроде .last() – Mark