In my Angular 2 component I have an Observable array
list$: Observable;
In my Template
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.
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..
Can be shortened as well:
<div *ngIf="!(list$ | async)?.length">No records found.</div>
Just use the exclamation mark before the parenthesis.
You can use the | async
pipe:
<div *ngIf="(list$ | async)?.length==0">No records found.</div>
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>
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>
ionic 4
<div *ngIf="(items | async)?.length==0">No records found.</div>
it worked when i removed the $
sign