2016-06-02 3 views
10

Я подписавшись на имущество магазина в компоненте конструктораObservable.subscribe() работает только один раз (ngrx angular2)

constructor(private someService: SomeService){ 
     someService.someObservable.subscribe((data: Some)=> { 
      this.some = data; 
      console.log('changed'); 
     }); 
} 

В службе, конструктор выглядит следующим образом:

constructor(private store: Store<any>){ 
     this.someObservable = <Observable<{}>>store.select('some'); 
} 

Я продолжаю изменять состояние этого объекта, но журнал регистрируется только один раз. Что также странно, так это то, что я обращаюсь к this.some собственности прямо в моем шаблоне (без async pipe), и он отлично обновляется! Кажется, что this.some Недвижимость в настоящее время обновляется, но в подписке не работает.

Помогите кому-нибудь? благодаря!

+2

Какое качество обслуживания у вас? – paulpdaniels

+0

В конструкторе сервера я выставляю «Наблюдаемый», например: 'this.some = > store.select ('some')' –

+0

Я смущен. Является ли 'some' и Observable или ваши данные? можете ли вы добавить более полный код к вашему примеру? Предпочтительно, что можно запустить и воспроизвести проблему? – paulpdaniels

ответ

1

Вы не должны вызывать службы в конструкторе и считаться плохой практикой. Используйте метод ngOnInit() для подписки на услугу. Этот метод будет вызываться автоматически при загрузке компонента.

Попробуйте это, это может решить вашу проблему.

import {Component, OnInit} from "@angular/core"; 

export class YourComponent implements OnInit{ 

    ngOnInit():void { 
     //handle your subscription here 
    } 

} 
+1

Не работает. Может быть, это имеет какое-то отношение к 'ChangeDetectionStrategy'? –

+1

Ваш совет на месте, но это не отвечает на вопрос.размещение вычислений в вашем конструкторе только задерживает создание объекта, и вы не можете получить доступ к свойствам – svarog

+0

@svarog, на самом деле это не вызовет каких-либо задержек, потому что наблюдаемое является асинхронным. Правильный способ его реализации, как и предлагает «icsapper». – Pradeep

0

Убедитесь, что вы возвращаете новый объект из редуктора при обновлении свойства и возвращать тот же объект не будет инициировать событие обновления магазин

переключатель (action.type) {

case MAIN_MENU_TOGGLE : { 

Ex вернуть Object.assign ({}, AppSettings {isMainMenuExpand: флаг})}

+0

Я делаю это, это не проблема –

1

В моей очень похожем случае проблема заключалась в том, что один из с Обработчики ubscription бросали ошибку. Когда встречается ошибка, наблюдаемый поток прекращает выдавать новые значения.

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