101

Refered to https://angular.io/docs/ts/latest/guide/displaying-data.html and stack How to check empty object in angular 2 template using *ngIf still getting syntax error self context undefined. If I remove *ngIf condition then I am getting values in teamMembers if I push some value into it so I can access values in teamMembers.

my teamMember object is [ ] array i am trying to check condition array is empty by size.

Tries :

<div class="row" *ngIf="(teamMembers | json) != '{}'">

and

<div class="row" *ngIf="teamMembers.length > 0"> //Check length great than
                                                 throwing syntax error
            <div class="col-md-12">
                <h4>Team Members</h4>
                <ul class="avatar" *ngFor="let member of teamMembers">
                    <li><a href=""><gravatar-image [size]="80" [email]="member.email"></gravatar-image></a></li>
                </ul>
            </div>
        </div>

Component :

@Component({
selector: 'pbi-editor',
})
export class AppComponent implements OnInit {
teamMembers: User[];

Any help would be great.

Syed mohamed aladeen
  • 6,507
  • 4
  • 32
  • 59
Karthigeyan Vellasamy
  • 2,038
  • 6
  • 33
  • 50

5 Answers5

325
<div class="row" *ngIf="teamMembers?.length > 0">

This checks first if teamMembers has a value and if teamMembers doesn't have a value, it doesn't try to access length of undefined because the first part of the condition already fails.

Günter Zöchbauer
  • 623,577
  • 216
  • 2,003
  • 1,567
  • 4
    Here is the correct link to the `safe navigation operator`: https://angular.io/guide/template-syntax#safe-navigation-operator – Michael W. Czechowski Jan 23 '18 at 10:07
  • This may throw Operator '>' cannot be applied to types 'boolean' and 'number'. while optimizing build with --aot or prod – krish Sep 27 '18 at 05:51
20

You could use *ngIf="teamMembers != 0" to check whether data is present

Günter Zöchbauer
  • 623,577
  • 216
  • 2,003
  • 1,567
AishApp
  • 4,142
  • 2
  • 29
  • 33
8

You can use

<div class="col-sm-12" *ngIf="event.attendees?.length">

Without event.attendees?.length > 0 or even event.attendees?length != 0

Because ?.length already return boolean value.

If in array will be something it will display it else not.

Druta Ruslan
  • 7,171
  • 2
  • 28
  • 38
4

Maybe slight overkill but created library ngx-if-empty-or-has-items it checks if an object, set, map or array is not empty. Maybe it will help somebody. It has the same functionality as ngIf (then, else and 'as' syntax is supported).

arrayOrObjWithData = ['1'] || {id: 1}

<h1 *ngxIfNotEmpty="arrayOrObjWithData">
  You will see it
</h1>

 or 
 // store the result of async pipe in variable
 <h1 *ngxIfNotEmpty="arrayOrObjWithData$ | async as obj">
  {{obj.id}}
</h1>

 or

noData = [] || {}
<h1 *ngxIfHasItems="noData">
   You will NOT see it
</h1>
alexKhymenko
  • 5,450
  • 23
  • 40
-1

This article helped me alot figuring out why it wasn't working for me either. It give me a lesson to think of the webpage loading and how angular 2 interacts as a timeline and not just the point in time i'm thinking of. I didn't see anyone else mention this point, so I will...

The reason the *ngIf is needed because it will try to check the length of that variable before the rest of the OnInit stuff happens, and throw the "length undefined" error. So thats why you add the ? because it won't exist yet, but it will soon.