974

I'm using Angular and I want to use *ngIf else (available since version 4) in this example:

<div *ngIf="isValid">
  content here ...
</div>

<div *ngIf="!isValid">
 other content here...
</div>

How can I achieve the same behavior with ngIf else?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
El houcine bougarfaoui
  • 35,805
  • 9
  • 37
  • 37

22 Answers22

1434

Angular 4 and 5:

Using else:

<div *ngIf="isValid;else other_content">
    content here ...
</div>

<ng-template #other_content>other content here...</ng-template>

You can also use then else:

<div *ngIf="isValid;then content else other_content">here is ignored</div>
<ng-template #content>content here...</ng-template>
<ng-template #other_content>other content here...</ng-template>

Or then alone:

<div *ngIf="isValid;then content"></div>
<ng-template #content>content here...</ng-template>

Demo:

Plunker

Details:

<ng-template>: is Angular’s own implementation of the <template> tag which is according to MDN:

The HTML <template> element is a mechanism for holding client-side content that is not to be rendered when a page is loaded but may subsequently be instantiated during runtime using JavaScript.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
El houcine bougarfaoui
  • 35,805
  • 9
  • 37
  • 37
  • 11
    I hoped there was a way just to use without another tag like div, but oddly it is not... I know the
    gets removed as you use it, but it's kinda weird as implementation I think.
    – andreas Mar 30 '17 at 20:03
  • 40
    @andreas You can use `` for the if-clause – Martin Schneider Jun 17 '17 at 11:08
  • 4
    Note: you can use `ng-container` for the container containing *ngIf, but not for the template – Simon_Weaver Jan 18 '18 at 01:32
  • @Simon_Weaver I figured it out the hard way. But why? why didn't they allow `*ngIf ` to work on `ng-template`? – Eran Medan Mar 15 '18 at 06:02
  • 2
    here is ignored it is not ignored. it is place fot injecting ng-template – dimson d Apr 25 '18 at 19:32
  • Just to add a little info, assigning the template value(#templateValue) directly to component tag and using it with else syntax doesn't work. You should embed the component tag inside of `` and assign the template value to `ng-template` like, `` – DongBin Kim May 23 '18 at 09:39
  • Hi @Bougarfaoui El houcine , Can I use
    other content here...
    instead other content here... ? Means Can I use div rather than template ?
    – Shubham Verma Aug 02 '18 at 07:19
  • I've found that you can create if-then-elseif-elseif-elseif using ng-containers and ng-templates. ` ` It's super verbose though, and the need for #ids for each ifelse feels clunky, for something that other web frameworks can accomplish with a single tag/operation. – Josiah Aug 15 '18 at 16:22
  • Agree with @Josia, it's clunky. If would have been more natural to have an *ngElse much like the *ngSwitchDefault implementation. Because of that, we find it bad practice to use angular's "ngIf..else" construct due to its inconsistency, non intuitiveness and its template variable pollution. It's just weird. You are better off negating the *ngIf for your else blocks, it's more readable most of the time. – Max Feb 09 '19 at 03:57
  • Having started out on Angular 1 and then left for React, now I am back on a project using Angular 5... is this real life? This construct is legitimately bad. – user602525 Feb 15 '19 at 03:52
  • This also works in ionic 4 with angular 7. Thanks a lot :) – Kamlesh Apr 01 '19 at 05:13
  • Within a 'then' or 'else' statement we're specifying the id of the ng-template tag to use. Isn't that basically a goto-statement?! – Antony Sep 17 '19 at 16:23
  • Is there a way to bind ngTemplateOutletContext when doing it this way? – fix Jan 10 '23 at 14:28
262

In Angular 4.x.x

You can use ngIf in four ways to achieve a simple if-else procedure:

  1. Just use If

    <div *ngIf="isValid">
        If isValid is true
    </div>
    
  2. Using If with Else (please notice to templateName)

    <div *ngIf="isValid; else templateName">
        If isValid is true
    </div>
    
    <ng-template #templateName>
        If isValid is false
    </ng-template>
    
  3. Using If with Then (please notice to templateName)

    <div *ngIf="isValid; then templateName">
        Here is never showing
    </div>
    
    <ng-template #templateName>
        If isValid is true
    </ng-template>
    
  4. Using If with Then and Else

    <div *ngIf="isValid; then thenTemplateName else elseTemplateName">
        Here is never showing
    </div>
    
    <ng-template #thenTemplateName>
        If isValid is true
    </ng-template>
    
    <ng-template #elseTemplateName>
        If isValid is false
    </ng-template>
    

Tip: ngIf evaluates the expression and then renders the then or else template in its place when the expression is truthy or falsy respectively.

Typically the:

  • then template is the inline template of ngIf unless bound to a different value.
  • else template is blank unless it is bound.
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
58

For Angular 9/8

Source Link with Examples

    export class AppComponent {
      isDone = true;
    }

1) *ngIf

    <div *ngIf="isDone">
      It's Done!
    </div>

    <!-- Negation operator-->
    <div *ngIf="!isDone">
      It's Not Done!
    </div>

2) *ngIf and Else

    <ng-container *ngIf="isDone; else elseNotDone">
      It's Done!
    </ng-container>

    <ng-template #elseNotDone>
      It's Not Done!
    </ng-template>

3) *ngIf, Then and Else

    <ng-container *ngIf="isDone;  then iAmDone; else iAmNotDone">
    </ng-container>

    <ng-template #iAmDone>
      It's Done!
    </ng-template>

    <ng-template #iAmNotDone>
      It's Not Done!
    </ng-template>
Code Spy
  • 9,626
  • 4
  • 66
  • 46
  • 2
    The question is, which one is better? From a performance point of view, I suspect that the 1st one has 2 directives which need to be evaluated independently, while the other 2 have only one. If you had this in a list/table of thousands of elements, would it not be slower? – AsGoodAsItGets Nov 12 '20 at 17:04
  • Solution 1 is bad if default value is not truthy – Bitzu May 11 '22 at 15:17
47

Just add new updates from Angular 8.

  1. For case if with else, we can use ngIf and ngIfElse.

    <ng-template [ngIf]="condition" [ngIfElse]="elseBlock">
      Content to render when condition is true.
    </ng-template>
    <ng-template #elseBlock>
      Content to render when condition is false.
    </ng-template>
    
  2. For case if with then, we can use ngIf and ngIfThen.

    <ng-template [ngIf]="condition" [ngIfThen]="thenBlock">
      This content is never showing
    </ng-template>
    <ng-template #thenBlock>
      Content to render when condition is true.
    </ng-template>
    
  3. For case if with then and else, we can use ngIf, ngIfThen, and ngIfElse.

    <ng-template [ngIf]="condition" [ngIfThen]="thenBlock" [ngIfElse]="elseBlock">
      This content is never showing
    </ng-template>
    <ng-template #thenBlock>
      Content to render when condition is true.
    </ng-template>
    <ng-template #elseBlock>
      Content to render when condition is false.
    </ng-template>
    
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Hoang Subin
  • 6,610
  • 6
  • 37
  • 56
39

If isShow is true then the first line execute, otherwise secondline executes, because elseBlockShow is working as a reference variable.

<div *ngIf="isShow; else elseBlockShow">
  Text to show for If
</div>
<ng-template #elseBlockShow>
  Text to show for else block
</ng-template>
David Wolf
  • 1,400
  • 1
  • 9
  • 18
Naeem Bashir
  • 1,937
  • 20
  • 17
35

To work with observable, this is what I usually do to display if the observable array consists of data.

<div *ngIf="(observable$ | async) as listOfObject else emptyList">
   <div >
        ....
    </div>
</div>
 <ng-template #emptyList>
   <div >
        ...
    </div>
</ng-template>
Ah Hiang
  • 592
  • 6
  • 13
25

Here's some nice and clean syntax on Angular's NgIf and using the else statement. In short, you will declare an ElementRef on an element and then reference it in the else block:

<div *ngIf="isLoggedIn; else loggedOut">
   Welcome back, friend.
</div>

<ng-template #loggedOut>
  Please friend, login.
</ng-template>

I've taken this example from NgIf, Else, Then which I found to be really well explained.

It also demonstrates using the <ng-template> syntax:

<ng-template [ngIf]="isLoggedIn" [ngIfElse]="loggedOut">
  <div>
    Welcome back, friend.
  </div>
</ng-template>

<ng-template #loggedOut>
  <div>
    Please friend, login.
  </div>
</ng-template>

And also using <ng-container> if that's what you're after:

<ng-container
  *ngIf="isLoggedIn; then loggedIn; else loggedOut">
</ng-container>

<ng-template #loggedIn>
  <div>
    Welcome back, friend.
  </div>
</ng-template>
<ng-template #loggedOut>
  <div>
    Please friend, login.
  </div>
</ng-template>

Source is taken from here on Angular's NgIf and Else syntax.

Stephen Jenkins
  • 1,776
  • 3
  • 24
  • 39
14

You can use <ng-container> and <ng-template> to achieve this:

<ng-container *ngIf="isValid; then template1 else template2"></ng-container>

<ng-template #template1>
     <div>Template 1 contains</div>
</ng-template>

<ng-template #template2>
     <div>Template 2 contains </div>
</ng-template>

You can find the StackBlitz Live demo below:

Live demo

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
DeC
  • 2,226
  • 22
  • 42
9

"bindEmail" will check if email is available or not. If email does exist then Logout will show. Otherwise Login will show.

<li *ngIf="bindEmail;then logout else login"></li>
<ng-template #logout><li><a routerLink="/logout">Logout</a></li></ng-template>
<ng-template #login><li><a routerLink="/login">Login</a></li></ng-template>
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
6

An ngif expression resulting value won’t just be the Boolean true or false.

If the expression is just an object, it still evaluates it as truthiness.

If the object is undefined, or non-existent, then ngif will evaluate it as falseness.

Common use is if an object loaded, exist, and then display the content of this object, otherwise display "loading.......".

 <div *ngIf="!object">
     Still loading...........
 </div>

<div *ngIf="object">
     <!-- the content of this object -->

           object.info, object.id, object.name ... etc.
 </div>

Another example:

  things = {
 car: 'Honda',
 shoes: 'Nike',
 shirt: 'Tom Ford',
 watch: 'Timex'
 };

 <div *ngIf="things.car; else noCar">
  Nice car!
 </div>

<ng-template #noCar>
   Call a Uber.
</ng-template>

 <!-- Nice car ! -->

Another example:

<div *ngIf="things.car; let car">
   Nice {{ car }}!
 </div>
<!-- Nice Honda! -->

ngif template

ngif Angular 4

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
hoogw
  • 4,982
  • 1
  • 37
  • 33
6

There are two possibilities to use an if condition on an HTML tag or templates:

  1. *ngIf directive from CommonModule, on HTML tag;
  2. if-else

Enter image description here

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
RazvanParautiu
  • 2,805
  • 2
  • 18
  • 21
6

You can also use the JavaScript short ternary conditional operator ? in Angular like this:

{{doThis() ? 'foo' : 'bar'}}

or

<div [ngClass]="doThis() ? 'foo' : 'bar'">
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Sebastian Viereck
  • 5,455
  • 53
  • 53
6

**ngIf else**

<div *ngIf="isConditionTrue;else other_condition">
    your content here
</div>

<ng-template #other_condition>other content here...</ng-template>

**ngIf then else**

<div *ngIf="isConditionTrue;then content else other_content">here is ignored</div>
<ng-template #content>content here...</ng-template>
<ng-template #other_content>other content here...</ng-template>


**ngIf then**

<div *ngIf="isConditionTrue;then content"></div>
<ng-template #content>content here...</ng-template>
ajay
  • 113
  • 3
  • 10
5

Syntax for ngIf/Else

<div *ngIf=”condition; else elseBlock”>Truthy condition</div>
<ng-template #elseBlock>Falsy condition</ng-template>

Enter image description here

Using NgIf / Else/ Then explicit syntax

To add a then template, we just have to bind it to a template explicitly.

<div *ngIf=”condition; then thenBlock else elseBlock”> ... </div>
<ng-template #thenBlock>Then template</ng-template>
<ng-template #elseBlock>Else template</ng-template>

Enter image description here

Observables with NgIf and Async Pipe

For more details

Enter image description here

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
L Y E S - C H I O U K H
  • 4,765
  • 8
  • 40
  • 57
5

ng-template

<ng-template [ngIf]="condition1" [ngIfElse]="template2">
        ...
</ng-template>


<ng-template #template2> 
        ...
</ng-template>
Aniket
  • 552
  • 4
  • 13
5
<div *ngIf="isValid; else templateName">
  If isValid is true
</div>

<ng-template #templateName>
  If isValid is false
</ng-template>
F. Müller
  • 3,969
  • 8
  • 38
  • 49
Dummy1
  • 63
  • 1
  • 4
  • Same as https://stackoverflow.com/questions/43006550/how-can-i-use-ngif-else/46833339#46833339 – ErDeep Mar 14 '23 at 11:16
4

In Angular 4.0 if..else syntax is quite similar to conditional operators in Java.

In Java you use to "condition?stmnt1:stmnt2".

In Angular 4.0 you use *ngIf="condition;then stmnt1 else stmnt2".

msanford
  • 11,803
  • 11
  • 66
  • 93
Amit Gaikwad
  • 516
  • 4
  • 12
  • 1
    looks like Oracle case when expression.. :-) – Peter Jun 30 '17 at 08:09
  • 5
    You're referring to the [ternary operator which exists in most C-based languages](https://en.wikipedia.org/wiki/%3F:) but this is closer to [Kotlin's if expressions](https://kotlinlang.org/docs/reference/control-flow.html#if-expression). – mythz Jun 30 '17 at 11:05
  • condition?stmnt1:stmnt2, this doesn't work only in java. So it is not only java related – Andre TOKAM May 03 '23 at 14:31
4
<div *ngIf="show; else elseBlock">Text to show</div>
<ng-template #elseBlock>Alternate text while primary text is hidden</ng-template>
Maddy
  • 503
  • 6
  • 17
  • An explanation would be in order. E.g., what is the idea/gist? Please respond by [editing (changing) your answer](https://stackoverflow.com/posts/62749789/edit), not here in comments (***without*** "Edit:", "Update:", or similar - the answer should appear as if it was written today). – Peter Mortensen Nov 03 '21 at 16:41
2
<div *ngIf="this.model.SerialNumber != '';then ConnectedContent else DisconnectedContent" class="data-font">    </div>

<ng-template #ConnectedContent class="data-font">Connected</ng-template>
<ng-template #DisconnectedContent class="data-font">Disconnected</ng-template>
Amir Touitou
  • 3,141
  • 1
  • 35
  • 31
  • An explanation would be in order. E.g., what is the idea/gist? Please respond by [editing (changing) your answer](https://stackoverflow.com/posts/49882364/edit), not here in comments (***without*** "Edit:", "Update:", or similar - the answer should appear as if it was written today). – Peter Mortensen Nov 03 '21 at 16:23
2

In Angular 4, 5 and 6

We can simply create a template reference variable 2 and link that to the else condition inside an *ngIf directive

The possible syntaxes 1 are:

<!-- Only If condition -->
<div *ngIf="condition">...</div>
<!-- or -->
<ng-template [ngIf]="condition"><div>...</div></ng-template>


<!-- If and else conditions -->
<div *ngIf="condition; else elseBlock">...</div>
<!-- or -->
<ng-template #elseBlock>...</ng-template>

<!-- If-then-else -->
<div *ngIf="condition; then thenBlock else elseBlock"></div>
<ng-template #thenBlock>...</ng-template>
<ng-template #elseBlock>...</ng-template>


<!-- If and else conditions (storing condition value locally) -->
<div *ngIf="condition as value; else elseBlock">{{value}}</div>
<ng-template #elseBlock>...</ng-template>

DEMO: https://stackblitz.com/edit/angular-feumnt?embed=1&file=src/app/app.component.html

Sources:

  1. NgIf - directive
  2. Template syntax
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Kalpesh Panchal
  • 965
  • 9
  • 20
  • Your answer states it's valid for Angular 4 through 6. It made sense 2018 when you wrote it but now, 4 years later, it suggests that it's **not** necessarily valid for the latest version. I just used it in Angular 13 and it works perfectly. You may want to consider updating the formulation to make your answer from great to even better. – Konrad Viltersten Mar 15 '22 at 06:40
1

So, this isn't actually using ng-if but many of the suggestions appear to deal with writing text in a conditional statement. I think this way is the best way to do that with least code or complication. You be the judge.

<div>{{variable == null ? 'Testing1' : 'Testing2'}}<div>
OR
<div>{{variable == null ? var1 : var2 }}<div>
Deathstalker
  • 794
  • 10
  • 8
0

The way I went about with is to have two flags in the component and two ngIfs for the corresponding two flags.

It was simple and worked well with material as ng-template and material were not working well together.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Nikhil Das Nomula
  • 1,863
  • 5
  • 31
  • 50
  • Can you [provide](https://stackoverflow.com/posts/52419833/edit) one or more code examples? (But ***without*** "Edit:", "Update:", or similar - the answer should appear as if it was written today.) – Peter Mortensen Nov 03 '21 at 16:28