如何使用异步管道代替订阅?

时间:2020-09-10 13:26:39

标签: javascript angular rxjs angular-pipe

我想使用异步管道“ | async”而不是订阅。这是我的订阅代码当前的样子:

ngOnInit(): void {
  this.activatedRoute.url
    .pipe(takeUntil(this.unsubscribe$))
      .subscribe(segments => {
        this.quizName = segments[1].toString();
      });
}

在我的模板中,我有:<mat-card *ngIf="quiz.quizId === quizName">

2 个答案:

答案 0 :(得分:2)

让我们尝试一下:

quizName$: Observable<any>;

ngOnInit(): void {
  this.quizName$ = this.activatedRoute.url
    .pipe(
      takeUntil(this.unsubscribe$),
      map(segments => segments[1].toString()); // Not sure about this part
    );
}
<mat-card *ngIf="(quizName$ | async) === quiz.quizId">

请注意,每次在模板中使用异步管道时,都会进行订阅。

答案 1 :(得分:2)

添加变量:

quizName$ = this.activatedRoute.url.pipe(map(segments => segments[1].toString()));
  1. 不需要takeUntil,例如“ | async”
  2. 可选(您的IDE会自己知道)
quizName$: Observable<string> ...

在HTML中:

*ngIf="(quizName$ | async) === quiz.quizId"

更多“强大”的解决方案

showQuiz$: Observable<boolean> = this.activatedRoute.url.pipe(
  map(segments => segments[1].toString()),
  map(quizName => quizName === this.quiz && this.quiz.id)
);
*ngIf="showQuiz$ | async"