#angular #rxjs #angular2-template #rxjs5
#angular #rxjs #angular2-шаблон #rxjs5
Вопрос:
Я использую службу состояния приложения на основе BehaviorSubject
s в Rx, которая предоставляет Observables
доступ к компонентам для работы. В одном из моих компонентов я хочу показать некоторые вложенные данные, если они присутствуют.
Это то, что я пытался
<div>>{{ sharedState.loadedAccountDetails.accountId | async }}</div>
Что выдает мне ошибку о невозможности получить идентификатор учетной записи undefined, что имеет смысл для меня, но я подумал, что, возможно, асинхронный канал поможет мне здесь.
В моем компоненте общее состояние — это просто Observable
, я не думаю, что есть что показать.
В конечном счете, я хочу показывать эти данные, когда они присутствуют, и ничего не отображать, когда их там нет. Как я могу этого добиться?
Ответ №1:
Вам нужно использовать async
канал непосредственно для Observable, а не для значений, передаваемых из Observable. В вашем шаблоне используйте это вместо:
<div>{{ (sharedState | async)?.loadedAccountDetails.accountId }}</div>
Со следующим компонентом:
import { Component } from '@angular/core';
import { Observable, Subject } from 'rxjs';
@Component({
selector: 'my-app',
template: `
I'm Loaded!
<div>{{ (sharedState | async)?.loadedAccountDetails.accountId }}</div>
`
})
export class AppComponent {
sharedState: Observable = null;
private subject = new Subject();
constructor() {
this.sharedState = this.subject.asObservable();
setTimeout(_ => {
this.subject.next({
loadedAccountDetails: {
accountId: 42
}
});
}, 1000);
}
}
Эта демонстрация показывает число 42
через одну секунду после создания компонента.
Смотрите живую демонстрацию: http://plnkr.co/edit/fGtNVOZWndYU22U4sRow
Комментарии:
1. Мне также пришлось использовать
?
on loadedAccountDetails, чтобы избежать другой ошибки, но это сработало, спасибо.2. Я думаю, мой вопрос кажется немного уродливым — есть ли лучший способ сделать это?
3. @Barry Я так не думаю, если вы хотите использовать
async
канал и сохранить все в шаблоне.