Как передать переменную async в функции шаблона (действия)?

Мне нужно передать асинхронную переменную в функцию. Что-то вроде этого:

<div class="team" (click)="addToFavorite((match | async)?.id)">

И конечно у меня ошибка.

Ошибка синтаксического анализатора: не может иметь канал в выражении действия.

Может быть, есть способ преобразовать асинхронную переменную в JavaScript?

Ответ 1

Другой вариант для простых переменных и без каких-либо наблюдаемых - записать значение переменной в скрытый ввод:

<div *ngIf="(match | async)?.id">
    <input  #myControl [value]="(match | async).id" type="hidden" />
    <div class="team" (click)="addToFavorite(myControl.value)">
</div>

Ответ 2

Вот как я это решил:

<div *ngIf="(match | async) as match" class="team" (click)="addToFavorite(match.id)">

Это коротко, просто, и это работает.

<ng-container *ngIf="(match | async) as match">
   <div class="team" (click)="addToFavorite(match.id)">
   </div>
</ng-container>

Ответ 3

Вы не можете сделать это в шаблоне.

Но вы можете:

<div class="team" (click)="addToFavorite()">

и в вашем .component.ts:

public addToFavorite() {
  this
    .match  // should retain last value (e.g. use BehaviorSubject)
    .first() // completes after passing one value only
    .subscribe(
      (matchValue) => {
        // your logic here
    });
}

Примечание: мы подписываемся (и немедленно отписываемся), аналогично async канал подписывается на Observable.

Ответ 4

Как насчет:

<div class="team" (click)="addToFavorite(match)">

а затем в вашем коде:

addToFavorite(obs: Observable<any>) {
  obs.take(1).subscribe(value => {
    addToFavoriteById(value.id);
  });
}

Ответ 5

Кажется, вам нужно использовать вспомогательный метод:

<div class="team" (click)="onClick(match)">
class MyComponent {
  onClick(event) {
    event.then(val => this.addToFavorite(val?.id);
  }
  addToFavorite(val) {
  }
}