How to check the length of an Observable array

AngularObservableAngular2 TemplateAngular2 Services

Angular Problem Overview


In my Angular 2 component I have an Observable array

list$: Observable<any[]>;

In my Template I have

<div *ngIf="list$.length==0">No records found.</div>

<div *ngIf="list$.length>0">
    <ul>
        <li *ngFor="let item of list$ | async">item.name</li>
    </ul>
</div>

But list$.length doesn't work with in case of Observable array.

Update:

It seems that (list$ | async)?.length gives us the length but the below code still doesn't work:

<div>
    Length: {{(list$ | async)?.length}}
    <div *ngIf="(list$ | async)?.length>0">
        <ul>
            <li *ngFor="let item of (list$ | async)">
                {{item.firstName}}
            </li>
        </ul>
    </div>
</div>

Can anyone please guide how do I check length of Observable array.

Angular Solutions


Solution 1 - Angular

You can use the | async pipe:

<div *ngIf="(list$ | async)?.length==0">No records found.</div>

Update - 2021-2-17

<ul *ngIf="(list$| async) as list; else loading">
   <li *ngFor="let listItem of list">
      {{ listItem.text }}
   </li>
</ul>

<ng-template #loading>
  <p>Shows when no data, waiting for Api</p>
  <loading-component></loading-component>
</ng-template>

Update - Angular Version 6:

If you are loading up a css Skeleton you can use this. If the array has no items it will display the css template. If there is data then fill out the ngFor.

<ul *ngIf="(list$| async)?.length > 0; else loading">
   <li *ngFor="let listItem of list$| async">
      {{ listItem.text }}
   </li>
</ul>

<ng-template #loading>
  <p>Shows when no data, waiting for Api</p>
  <loading-component></loading-component>
</ng-template>

Solution 2 - Angular

A solution for .ts-Files:

     this.list.subscribe(result => {console.log(result.length)});

Solution 3 - Angular

For Angular 4+, try this

<div *ngIf="list$ | async;let list">
    Length: {{list.length}}
    <div *ngIf="list.length>0">
        <ul>
            <li *ngFor="let item of list">
                {{item.firstName}}
            </li>
        </ul>
    </div>
</div>

Solution 4 - Angular

While this answer is correct

<div *ngIf="(list$ | async)?.length === 0">No records found.</div>

Keep in mind that if you are using http client to call backend (in most cases you do) you will get duplicate calls to your API if you have more that one list$ | async. This is because each | async pipe will create new subscriber to your list$ observable.

Solution 5 - Angular

Can be shortened as well:

<div *ngIf="!(list$ | async)?.length">No records found.</div>

Just use the exclamation mark before the parenthesis.

Solution 6 - Angular

This is what worked for me -

*ngIf="!photos || photos?.length===0"

I am getting my data from httpClient async.

All the other options here didn't work for me which was disappointing. Especially the sexy (list$ | async) pipe.

Basa..

Solution 7 - Angular

I had this issue with Observable<Customer[]> (initialized in a constructor) saying "object is possibly undefined" when trying to hide container div when arr length is empty So I had it like this: <div *ngIf="(similarCustomers$ | async)?.length > 0">

My co-worker solved it by doing this:

<div *ngIf="(similarCustomers$ | async) as similarCustomers">
  <ng-container *ngIf="similarCustomers.length > 0">

Solution 8 - Angular

ionic 4

<div *ngIf="(items | async)?.length==0">No records found.</div>

it worked when i removed the $ sign

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNaveed AhmedView Question on Stackoverflow
Solution 1 - AngularGünter ZöchbauerView Answer on Stackoverflow
Solution 2 - AngularBlankView Answer on Stackoverflow
Solution 3 - AngularMD KAMRUL HASAN SHAHEDView Answer on Stackoverflow
Solution 4 - AngularAndzej MaciusovicView Answer on Stackoverflow
Solution 5 - AngularDaniyal LukmanovView Answer on Stackoverflow
Solution 6 - AngularTzvi Gregory KaidanovView Answer on Stackoverflow
Solution 7 - AngularO-9View Answer on Stackoverflow
Solution 8 - AngularAhmed Al-hajriView Answer on Stackoverflow