* ng如果在模板中,否则


100

我如何在一个*ngIf陈述中处理多个案件?我已经习惯的Vue或角1与具有ifelse ifelse,但似乎角4只具有trueif)和falseelse)状态。

根据文档,我只能执行以下操作:

  <ng-container *ngIf="foo === 1; then first else second"></ng-container>
  <ng-template #first>First</ng-template>
  <ng-template #second>Second</ng-template>
  <ng-template #third>Third</ng-template>

但我想有多个条件(类似):

  <ng-container *ngIf="foo === 1; then first; foo === 2; then second else third"></ng-container>
  <ng-template #first>First</ng-template>
  <ng-template #second>Second</ng-template>
  <ng-template #third>Third</ng-template>

但是我最终不得不使用ngSwitch,这感觉像是一种hack:

  <ng-container [ngSwitch]="true">
    <div *ngSwitchCase="foo === 1">First</div>
    <div *ngSwitchCase="bar === 2">Second</div>
    <div *ngSwitchDefault>Third</div>
  </ng-container>

或者,似乎在Angular 4中不支持我从Angular 1和Vue习惯的很多语法,那么采用这种条件构造代码的推荐方法是什么?


我以为您骇客是最好的解决方案,因为它最易读。但是我已经意识到,角度开关语句允许匹配多个条件,因此您不会获得真正的elseif逻辑。
汤姆·贝尼永

Answers:


143

另一种选择是嵌套条件

<ng-container *ngIf="foo === 1;else second"></ng-container>
<ng-template #second>
    <ng-container *ngIf="foo === 2;else third"></ng-container>
</ng-template>
<ng-template #third></ng-template>

4
这对我来说是更好的解决方案。我的条件基于多个变量,并且多个变量可以同时满足。
马特·德科

1
我们不能使用类似<ng-template #second *ngIf="foo === 2;else third">
Loki

聪明。应该引入框架tbh
Pogrindis

36

您可以使用:

<ng-template [ngIf]="index == 1">First</ng-template>
<ng-template [ngIf]="index == 2">Second</ng-template>
<ng-template [ngIf]="index == 3">Third</ng-template>

除非我认为ng容器部分对您的设计很重要。

这是一个笨蛋


1
我的示例有点简单化,但是期望“ else if”行为使得if (index === 1) else if (foo === 2)必须编写if (index === 1) if (index !== 1 && foo === 2)的代码有点混乱并且更容易出错,因此我们不得不编写反逻辑的次数就更多了。

你看过矮人了吗?我认为我没有看到这个问题,索引一次只会是一件事。
迪伦

我认为这是我的示例,缺少解释,这是JS中的示例: if (item === 'food' && kind === 'hamburger') {} else if (item === 'food' && kind === 'hotdog') {} else if (item === 'drink' && kind === 'beer') {} else if (item === 'drink' && kind === 'wine') {} else { /* could be poisonous */ }

1
在该示例中,仍然存在太多相互排斥的问题,但是,重点仍然是,我需要在不编写大量冗余逻辑的情况下进行if,if,if和else的操作。看来Angular 4的模板缺少这种逻辑。

1
还有其他一些选择,听起来您可能会受益于NgTemplateOutlet* ngTemplateOutlet =“ drink; context:beer”之类的 with上下文,或者可能是另一个用于分类的组件。
迪伦

26

这似乎是最干净的方法

if (foo === 1) {

} else if (bar === 99) {

} else if (foo === 2) {

} else {

}

在模板中:

<ng-container *ngIf="foo === 1; else elseif1">foo === 1</ng-container>
<ng-template #elseif1>
    <ng-container *ngIf="bar === 99; else elseif2">bar === 99</ng-container>
</ng-template>
<ng-template #elseif2>
    <ng-container *ngIf="foo === 2; else else1">foo === 2</ng-container>
</ng-template>
<ng-template #else1>else</ng-template>

请注意,当条件涉及不同的变量时(一次只有1种情况为真),它就像一个正确的else if语句一样工作。在这种情况下,其他一些答案将无法正常工作。

撇开:天哪,那是一些非常丑陋的else if模板代码...


17

您可以根据情况使用多种方式:

  1. 如果您将Variable限制为特定的NumberString,则最好的方法是使用ngSwitch或ngIf:

    <!-- foo = 3 -->
    <div [ngSwitch]="foo">
        <div *ngSwitchCase="1">First Number</div>
        <div *ngSwitchCase="2">Second Number</div>
        <div *ngSwitchCase="3">Third Number</div>
        <div *ngSwitchDefault>Other Number</div>
    </div>
    
    <!-- foo = 3 -->
    <ng-template [ngIf]="foo === 1">First Number</ng-template>
    <ng-template [ngIf]="foo === 2">Second Number</ng-template>
    <ng-template [ngIf]="foo === 3">Third Number</ng-template>
    
    
    <!-- foo = 'David' -->
    <div [ngSwitch]="foo">
        <div *ngSwitchCase="'Daniel'">Daniel String</div>
        <div *ngSwitchCase="'David'">David String</div>
        <div *ngSwitchCase="'Alex'">Alex String</div>
        <div *ngSwitchDefault>Other String</div>
    </div>
    
    <!-- foo = 'David' -->
    <ng-template [ngIf]="foo === 'Alex'">Alex String</ng-template>
    <ng-template [ngIf]="foo === 'David'">David String</ng-template>
    <ng-template [ngIf]="foo === 'Daniel'">Daniel String</ng-template>
    
  2. 上面的代码不适合其他代码和动态代码,可以使用下面的代码:

    <!-- foo = 5 -->
    <ng-container *ngIf="foo >= 1 && foo <= 3; then t13"></ng-container>
    <ng-container *ngIf="foo >= 4 && foo <= 6; then t46"></ng-container>
    <ng-container *ngIf="foo >= 7; then t7"></ng-container>
    
    <!-- If Statement -->
    <ng-template #t13>
        Template for foo between 1 and 3
    </ng-template>
    <!-- If Else Statement -->
    <ng-template #t46>
        Template for foo between 4 and 6
    </ng-template>
    <!-- Else Statement -->
    <ng-template #t7>
        Template for foo greater than 7
    </ng-template>
    

注意:您可以选择任何格式,但是请注意每个代码都有自己的问题


1
IMO 2.应阅读*ngIf="foo >= 7; then t7"代替... else t7
hgoebl

我认为只有两条线foo >= 4 && foo <= 6; then t46; else t7应该起作用。

4

为了避免嵌套和ngSwitch,还存在这种可能性,它利用了Java中逻辑运算符的工作方式:

<ng-container *ngIf="foo === 1; then first; else (foo === 2 && second) || (foo === 3 && third)"></ng-container>
  <ng-template #first>First</ng-template>
  <ng-template #second>Second</ng-template>
  <ng-template #third>Third</ng-template>



0

您还可以使用这个古老的技巧将复杂的if / then / else块转换为稍微清晰的switch语句:

<div [ngSwitch]="true">
    <button (click)="foo=(++foo%3)+1">Switch!</button>

    <div *ngSwitchCase="foo === 1">one</div>
    <div *ngSwitchCase="foo === 2">two</div>
    <div *ngSwitchCase="foo === 3">three</div>
</div>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.