Локальная переменная в шаблоне для асинхронного канала (angular 2+)

В моем шаблоне есть что-то вроде...

<div> {{ (profile$ | async).username}}</div>
<div> {{ (profile$ | async).email}}</div>

Есть ли способ присвоить (профиль | async) локальную переменную? необходимость распечатывать его для каждого отдельного поля плохо для читаемости.

Спасибо.

Ответы

Ответ 1

Лучшим подходом было бы создание нового компонента, например. в этом случае app-profile и передать profile | async этому компоненту. Внутри компонента вы можете назвать переменную, что угодно.

<app-profile [profile]="profile | async"></app-profile>

Ответ 2

Так как Angular 4.0.0-rc.1 (2017-02-24), вы можете использовать расширенный синтаксис *ngIf. Это позволит вам назначить результат условия *ngIf в локальной переменной шаблона:

<div *ngIf="profile$ | async as profile">
    <div>{{profile.username}}</div>
    <div>{{profile.email}}</div>
</div>

Обновленная *ngIf документация идет более подробно и дает много хороших примеров, используя async и *ngIf вместе.

Обязательно также проверяйте инструкции then и else *ngIf.

Кори Ролан сделал короткое учебное пособие которое можно переварить через 5-10 минут.

Ответ 3

Это немного взломано, но я, кажется, много примеров, используя что-то вроде этого:

<template ngFor let-profile [ngForOf]="profile$ | async">
  <div> {{ profile.username }}</div>
  <div> {{ profile.avatar }}</div>
  <div> {{ profile.email }}</div>
  ...
</template>

Ответ 4

Есть альтернатива, но она более утомительна. Решение, которое подал Гюнтер Цохбауэр, смягчает этот факт.

Альтернативой было бы подписаться на наблюдаемое внутри компонента, а затем использовать переменную подписки в вашем шаблоне. Вы должны отменить подписку в событии OnDestroy, чтобы предотвратить утечку памяти. Асинхронная труба сделает это за вас. Вот почему принятое решение чище. Но если вы не хотите создавать новый компонент, это путь.