angular - Använd async pipe och observable för hela blocket


Jag har en Observable som returnerar ett stort objekt från ett API. Jag behöver visa dessa värden i min mall.

För andra data som returneras som en array kan jag använda:

<div *ngFor="let value of values | async">
  <p>{{ value.prop }}</p>
</div>

Jag behöver inte vänta på att asynkroniteten ska slutföras inom *ngFor, eftersom den redan har en asincron pipe i föräldraelementet.

Med mitt objekt letar jag efter något liknande. För närvarande gör jag något liknande:

<h2>{{ (obj | async)?.title }}</h2>
<p>{{ (obj | async)?.prop.prop2 }}</p>
<p>{{ (obj | async)?.another.prop }}</p>

Detta lämnar uppenbarligen mycket duplicerad kod. Finns något liknande detta?

<div *using="obj | async">
  <!-- obj has resolved, can access obj.prop -->
</div>

Svar #1

Använd syntaxen 'as'.

Var också medveten om att varje async-pipe skapar en ny prenumeration och om din prenumeration använder http - betyder det flera http-anrop. Använd Rx share() om du vill använda samma observable flera gånger i mallen med async-pipe.

     @Component({
      selector: 'my-app',
      template: `
        <div>
          <div *ngIf="obj$ | async as obj; else empty">
         {{obj.x}}
         {{obj.y}}
         </div>
         <ng-template #empty>Empty. Wait 5 s...</ng-template>
        </div>
      `,
    })
    export class App {
      s = new Subject();
      obj$;
      constructor() {
        this.obj$ = this.s.asObservable();
        setTimeout(() => {
          this.s.next({x:12, y:100});
        }, 5000)
      }
    }

Svar #2

Du kan skapa ett alias på detta sätt:

<div *ngIf="(obj$ | async) as obj">
  <h2>{{ obj?.title }}</h2>
  <p>{{ obj?.prop.prop2 }}</p>
  <p>{{ obj?.another.prop }}</p>
</div>

Relaterade artiklar