#javascript #angular #rxjs #observable
#javascript #угловой #rxjs #наблюдаемый
Вопрос:
Я пытаюсь выполнить наблюдаемую цепочку / канал в зависимости от логической наблюдаемой, которая используется в условии if в шаблоне.
Но код в операторе pipe() никогда не выполняется, даже если я использую асинхронный канал для логической наблюдаемой в шаблоне.
<div>{{isAllowed$ | async}} --- resolves to true or false and shows on html page
<div *ngIf="isAllowed$ | async>
//other items
</div>
ngOnInit() {
this.isAllowed$ = callToMethodThatReturnsBooleanObservalble();
this.isAllowed$.pipe(
tap(val => { // -- never gets executed
if(val) {
//make rest call --- never gets executed
}
})
)
}
Это работает, если я помещаю subscribe() в конец канала, но я думал, что асинхронный канал сделал это за нас.
Ответ №1:
Вам нужно добавить канал к выполняемому вами вызову:
ngOnInit() {
this.isAllowed$ = callToMethodThatReturnsBooleanObservalble().pipe(
tap(val => {
if(val) {
}
})
);
}
pipe
Метод создает новый Observable
, поэтому, когда вы делаете это так, как делали раньше, этот observable не сохраняется, а также не подписывается на шаблон
Комментарии:
1. Однако запуск сетевого вызова из подписки, сделанной в шаблоне, для отображения данных не кажется хорошей идеей.
Ответ №2:
Вы можете использовать Rxjs Subject . Это также служит в качестве observable и может передавать данные с помощью «next» всякий раз, когда вы хотите обновить изменения данных. Нет необходимости подписываться вручную, поскольку вы используете «асинхронный» канал.
Вы можете использовать что-то подобное в своем коде.
<div>
<div *ngIf="(isAllowed$ | async)">
//other items
</div>
</div>;
// In your .ts file //
public isAllowed$ = new Subject<boolean>();
ngOnInit() {
// Pass your function that returns a boolean in your subject isAllowed.
// and your subscription will trigger whenever there is a change
this.isAllowed$.next(callToMethodThatReturnsBooleanObservalble());
}