1

How can I include async here in this code for user?

<div *ngIf="usersService.loaded$ | async">
<nb-card>
  <nb-card-header>
    <h1> {{ user?.name }} | {{ user?.age }} </h1>
  </nb-card-header>
</nb-card>

The user is being initiated as follows using a method from the store:

    this.user = this.route.params
      .pipe(
        takeUntil(this.destroyed$),
        switchMap(({ userId }) => this.usersService.getSelectedUser(userId))
      );
1

2 Answers 2

5

Just surround the async pipe call with brackets:

<div *ngIf="usersService.loaded$ | async">
  <nb-card>
    <nb-card-header>
      <h1>{{ (user | async)?.name }} | {{ (user | async)?.age }}</h1>
    </nb-card-header>
  </nb-card>
</div>
Sign up to request clarification or add additional context in comments.

Comments

3

Here is one solution:

<div *ngIf="usersService.loaded$ | async">
    <nb-card>
        <nb-card-header>
            <ng-container *ngIf="user | async as usr; else notFound">
                <h1>{{usr.name}} | {{usr.age}}</h1>
            </ng-container>
        </nb-card-header>
    </nb-card>
</div>
<ng-template #notFound>
    <div class="error">could not locate the user</div>
</ng-template>

If you want to use the user in other parts of the card, you can move the *ngIf="user | async as usr" to the <nb-card> element. That way the user would be available in any card content.

<div *ngIf="usersService.loaded$ | async">
    <nb-card *ngIf="user | async as usr; else notFound">
        <nb-card-header>
            <h1>{{usr.name}} | {{usr.age}}</h1>
        </nb-card-header>
        <nb-card-content>
           {{usr.bio}}
        <nb-card-content>
    </nb-card>
</div>
<ng-template #notFound>
    <div class="error">could not locate the user</div>
</ng-template>

In the two cases above, if the user observable's value is null, then the *ngIf will fail. In some cases, you may want to use a default value when the user is null. I have been using this little trick that I probably learned somewhere on SO :)

<div *ngIf="usersService.loaded$ | async">
    <nb-card *ngIf="{usr: user | async} as obs">
        <nb-card-header>
            <h1>{{obs.usr?.name || 'Jane Doe'}} | {{obs.usr?.age || '100'}}</h1>
        </nb-card-header>
        <nb-card-content>
           {{obs.usr?.bio || 'Very Famous'}}
        <nb-card-content>
    </nb-card>
</div>

Actually, I would probably join the two observables like this...

<ng-container *ngIf="{loaded: usersService.loaded$ | async, usr: user | async} as obs">
    <div *ngIf="obs.loaded">
      <nb-card>
          <nb-card-header>
              <h1>{{obs.usr?.name || 'Jane Doe'}} | {{obs.usr?.age || '100'}}</h1>
          </nb-card-header>
          <nb-card-content>
            {{obs.usr?.bio || 'Very Famous'}}
          <nb-card-content>
      </nb-card>
    </div>
</ng-container>  

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.