Как использовать * ngIf еще?

631

Я использую Angular, и я хочу использовать *ngIf else(доступно с версии 4) в этом примере:

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

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

Как я могу достичь того же поведения с ngIf else?

Кавли Норман
источник
1
Проверьте здесь для Angular 8, объясненного в Примерах NgIf, NgIf Else и NgIf Then Else freakyjolly.com/…
Code Spy

Ответы:

982

Угловые 4 и 5 :

используя else:

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

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

Вы также можете использовать 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>

или thenодин:

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

Демо:

Plunker

Подробности:

<ng-template>: это собственная реализация <template>тега Angular в соответствии с MDN :

Элемент HTML <template>представляет собой механизм для хранения контента на стороне клиента, который не должен отображаться при загрузке страницы, но может впоследствии быть создан в течение времени выполнения с использованием JavaScript.

Bougarfaoui El Houcine
источник
8
Я надеялся, что есть способ просто использовать <ng-template> без другого тега, такого как div, но, как ни странно, это не так ... Я знаю, что <div> удаляется, когда вы его используете, но я думаю, что это довольно странно с точки зрения реализации.
андреас
20
@andreas Вы можете использовать <ng-container>для предложения if
Мартин Шнайдер
2
Примечание: вы можете использовать ng-containerдля контейнера, содержащего * ngIf, но не для шаблона
Simon_Weaver
@Simon_Weaver Я понял это трудным путем. Но почему? почему они не позволили *ngIf работать ng-template?
Эран Медан
<div * ngIf = "isValid; затем содержимое else other_content"> здесь игнорируется </ div> и не игнорируется. это место для инъекций ng-шаблона
dimson d
185

В Angular 4.xx Вы можете использовать ngIf четырьмя способами для достижения простой процедуры if else:

  1. Просто используйте, если

    <div *ngIf="isValid">
        If isValid is true
    </div>
    
  2. Использование If с остальным (обратите внимание на templateName )

    <div *ngIf="isValid; else templateName">
        If isValid is true
    </div>
    
    <ng-template #templateName>
        If isValid is false
    </ng-template>
    
  3. Использование If with Then (обратите внимание на templateName )

    <div *ngIf="isValid; then templateName">
        Here is never showing
    </div>
    
    <ng-template #templateName>
        If isValid is true
    </ng-template>
    
  4. Использование If с Then и 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>
    

Совет: ngIf оценивает выражение и затем отображает шаблон then или else на его месте, когда выражение верно или ложно, соответственно. Как правило,

  • затем шаблон является встроенным шаблоном ngIf, если он не связан с другим значением.
  • иначе шаблон пуст, если он не связан.
Джон Хенкель
источник
Кажется, компилятор не принимает ...; else .... Вероятно, ;следует удалить.
Слартидан
5
в angular-6 я проверил, ...; else ...и это сработало
WasiF
20

Чтобы работать с наблюдаемым, это то, что я обычно делаю для отображения, если наблюдаемый массив состоит из данных.

<div *ngIf="(observable$ | async) as listOfObject else emptyList">
   <div >
        ....
    </div>
</div>
 <ng-template #emptyList>
   <div >
        ...
    </div>
</ng-template>
Ах Хианг
источник
8

«bindEmail» проверит, доступна электронная почта или нет. если электронная почта существует, то будет отображаться Logout, иначе будет отображаться Login

<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>
Прашант Шривастава
источник
2
Это не работает Если бы это было правильно, то это все равно не добавило бы никакой ценности, потому что принятый ответ уже показывает, как это сделать.
Гюнтер Цохбауэр
8

Вы можете использовать <ng-container>и <ng-template>для этого

<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>

Вы можете найти демо Stackblitz Live ниже

живое демо

Надеюсь, что это поможет ... !!!

декабрь
источник
8

Для угловых 9/8

Ссылка на источник с примерами

    export class AppComponent {
      isDone = true;
    }

1) * нгф

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

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

2) * ngIf и остальное

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

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

3) * ngIf, тогда и остальное

    <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>
Код Шпион
источник
1
Это только повторяет то, что уже принято в принятом ответе
phil294
6

Синтаксис для ngIf / Else

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

введите описание изображения здесь

Использование NgIf / Else / Тогда явный синтаксис

Чтобы добавить шаблон, нужно просто явно привязать его к шаблону.

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

введите описание изображения здесь

Наблюдаемые с NgIf и Async Pipe

Больше подробностей

введите описание изображения здесь

LYES - CHIOUKH
источник
6

Просто добавьте новые обновления от Angular 8.

  1. В случае, если с помощью else мы можем использовать ngIf и 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>
  1. В случае, если с то, мы можем использовать ngIf и 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>
  1. В случае, если с помощью then и else мы можем использовать ngIf , ngIfThen и 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>
Хоанг Тран Сын
источник
Большой! Мы недавно перешли на угловую 8
Ислам Муртазаев
5

В Angular 4.0 if..elseсинтаксис очень похож на условные операторы в Java.

В Java вы используете для "condition?stmnt1:stmnt2".

В Angular 4.0 вы используете *ngIf="condition;then stmnt1 else stmnt2".

Амит Гайквад
источник
1
выглядит как случай Oracle, когда выражение .. :-)
Питер
5

результирующее значение выражения ngif не будет просто логическим значением true или false

если выражение является просто объектом, оно все равно оценивает его как истинность.

если объект не определен или не существует, то ngif будет оценивать его как ложность.

обычно используется, если объект загружен, существует, а затем отображает содержимое этого объекта, в противном случае отображается «загрузка .......».

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

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

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

другой пример:

  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 ! -->

Другой пример:

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

шаблон NGIF

NGIF угловой 4

hoogw
источник
5

ng-template

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


<ng-template #template2> 
        ...
</ng-template>
Aniket
источник
3

Существует две возможности использовать условие if для тега HTML или шаблонов:

  1. * директива ngIf от CommonModule для тега HTML;
  2. если еще

введите описание изображения здесь

Рзв Разван
источник
1
<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>
Амир Туиту
источник
1

В угловых 4, 5 и 6

Мы можем просто создать ссылочную переменную шаблона [2] и связать ее с условием else внутри директивы * ngIf

Возможные синтаксисы [1] :

<!-- 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>

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

Источники:

  1. https://angular.io/api/common/NgIf#syntax
  2. https://angular.io/guide/template-syntax#template-reference-variables--var-
Калпеш Панчал
источник
1

Вы также можете использовать Javascript кратковременный условный оператор? в угловом, как это:

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

или

<div [ngClass]="doThis() ? 'foo' : 'bar'">
Себастьян Вирек
источник
0

Я знаю, что это было давно, но хочу добавить, если это поможет. Я решил использовать два флага в компоненте и два ngIf для соответствующих двух флагов.

Это было просто и хорошо работало с материалом, так как ng-template и материал плохо работали вместе.

user1707141
источник