2016-12-08 4 views
1

У меня есть общее представление о том, как работают наблюдаемые 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(), но не может подписаться на что-либо подобное.

Любые предложения о том, как я могу настроить, как я буду об этом, были бы замечательными.

Надеюсь, это имеет смысл, спасибо заранее.

+0

Я не уверен, что значение есть в конструкторе или ngInit .... То, что я делал, это создать метод GetMyObservable(), который возвращает наблюдаемый, и я подписываюсь на этот метод .... работает как шарм. Не знаю, это ваша проблема или нет. –

+0

спасибо за совет Джон, мне кажется, что я подписываюсь на работы, но на самом деле я не хочу подписки. Я думаю, мне нужно что-то, чтобы дать мне снимок наблюдаемого, что-то вроде .last() – Mark

ответ

0

я смог обойти вопрос, используя BehviourSubject из библиотеки RXJS:

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

специфический член .getValue() возвращает последний объект в наблюдаемом потоке. Поэтому вместо того, чтобы дочерние компоненты подписывались на наблюдаемые, они просто запрашивают последнее значение. Таким образом, когда они обновляют наблюдаемый пар, они не перерабатывают себя.

Смежные вопросы