2017-01-24 23 views
-1

TLDR: Наблюдаемый объект не запускает рендеринг компонентов, пока пользователь не сделает действие (например, нажмите кнопку).Угловое2 Необусловляемое не срабатывание реверсирования

Я обновляю наблюдаемый, поддерживаемый объектом BehaviorSubject, содержащимся внутри службы, которая вводится внутри моего компонента.

В моем компоненте я использую простой *ngIf="myObservable$ | async" для отображения div.

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

//CASE 1 
this._mySubject$.next(true); //THIS DOES TRIGGER RERENDERING 
//CASE 2 
this.http.get(url) 
.map(res => res.json()) 
.subscribe(body => { 
    this._mySubject$.next(true); //THIS DOESN'T TRIGGER RERENDERING UNTIL AN ACTION IS MADE 
}); 
+2

Как срабатывает весь поток? И какую версию углового2 вы используете? - Вероятно, вы можете решить свою проблему, обернув '.next (true)' в 'ngZone.run (...)' - однако это не должно быть необходимо с помощью простого вызова rest, поэтому моя текущая догадка заключается в том, что ваш rest-call каким-то образом завернут внутри какого-либо другого асинхронного/внешнего триггера. – olsn

+0

Я использую Angular 2.1.0. Мой компонент, который уже подписан на наблюдаемый, вызывает функцию сервиса, которая делает простой HTTP-вызов (не завернутый ничем). – Yanis26

+0

Любая конкретная причина использования блока 'subscribe()' для вызова '.next()'? Блоки Subscribe не должны использоваться для создания побочных эффектов. Только конечный потребитель (ы) наблюдаемого должен подписаться. – AngularChef

ответ

0

Если вам нужно сделать побочные эффекты попытаться сделать это в сделать оператор

this.http.get(url) 
.map(res => res.json()) 
.do(() => this._mySubject$.next(true)) 
.subscribe(); 
+0

Я также пробовал этот путь, и он по-прежнему не вызывает реинжиниринг. – Yanis26

+0

@ Yanis26 На шаблоне вы делаете '* ngIf =" _ mySubject $ | async "' ?? –

+0

Я использую наблюдаемый мой объект BehaviorSubject в своем шаблоне ('_.mySubject $ .asObservable()'), поэтому компонент не может мутировать данные. Что странно, что я делаю это с 3 другими BehaviorSubject/Observable с той же настройкой: http-запрос -> нажатие данных, полученных в мою тему, -> сам компонент обновляет. Только этот не работает, и это довольно неприятно, поскольку все остальное делается точно так же. – Yanis26

0

Это может быть лучшей идеей, чтобы подписаться на поведение субъекта в методе ngOnInit и задать свойство для использования в ngIf. Поскольку фактический объект не является новым объектом, то только новая эмиссия от субъекта поведения, вероятно, не вызывает обнаружение изменений Углового. Кажется, что лучше всего играть с неизменяемыми объектами.

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

  • Нет связанных вопросов^_^