* ngIf else if in template


100

*ngIf명세서에 여러 케이스가있는 방법은 무엇입니까? 나는 갖는 뷰 또는 각도 1 사용 해요 if, else if그리고 else있지만, 단지가 각도 4 것 같다 true( if)와 false( else) 상태.

문서에 따르면 다음과 같은 작업 만 수행 할 수 있습니다.

  <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해킹처럼 느껴지는 을 사용해야합니다 .

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

또는 Angular 1 및 Vue에서 익숙한 많은 구문이 Angular 4에서 지원되지 않는 것처럼 보이므로 이와 같은 조건으로 코드를 구성하는 데 권장되는 방법은 무엇입니까?


가장 가독성이 높기 때문에 해킹이 최선의 해결책이라고 생각했습니다. 그러나 각도 스위치 문은 여러 기준이 일치하도록 허용하므로 진정한 elseif 논리를 얻지 못합니다.
Tom Benyon

답변:


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
이것은 나에게 더 나은 솔루션이었습니다. 내 조건은 여러 변수를 기반으로했으며 둘 이상의 변수가 동시에 참일 수있었습니다.
Matt DeKok 2017-10-02

1
우리는 같이 사용할 수 없습니다<ng-template #second *ngIf="foo === 2;else third">
로키

영리한. 프레임 워크에 소개되어야합니다. 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-container 부분이 당신의 디자인에 중요하지 않다면 요.

여기 플런 커가 있습니다


1
내 예는 조금 단순하지만이되도록 행동 '다른 경우'기대 if (index === 1) else if (foo === 2)작성해야하는 if (index === 1) if (index !== 1 && foo === 2)약간의 혼란과 오류를하는 경향이다, 우리가 더 많은 시간이 반대 논리를 작성 할 수 있습니다.

플 런커를 보셨습니까? 나는 문제를 보지 못한다고 생각합니다. 인덱스는 한 번에 하나의 것입니다.
Dylan

설명이 부족한 내 예라고 생각합니다. 여기 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 및 else가 아니라 if, else if, else를 수행해야한다는 것입니다. Angular 4의 템플릿에는 이런 종류의 논리가없는 것 같습니다.

1
몇 가지 다른 옵션이 있습니다. NgTemplateOutlet* ngTemplateOutlet = "drink; context : beer"와 같은 컨텍스트가있는 경우 또는 분류를위한 다른 구성 요소 가 도움이 될 수 있습니다 .
Dylan

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>

공지는 것을 적절한처럼 작동 else if해야 문 조건이 다른 변수를 포함 (단 1 케이스는 한 번에 사실이다). 다른 답변 중 일부는 이러한 경우 제대로 작동하지 않습니다.

제쳐두고 : gosh angular, 정말 못생긴 else if템플릿 코드입니다 ...


17

상황에 따라 여러 가지 방법을 사용할 수 있습니다.

  1. Variable이 특정 Number 또는 String으로 제한되는 경우 가장 좋은 방법은 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를 방지하기 위해 논리 연산자가 Javascript에서 작동하는 방식을 활용하는 다음과 같은 가능성도 있습니다.

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

2

또는 삼항 연산자와 함께 조건부 체인을 사용할 수도 있습니다. if … else if … else if … else체인.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator#Conditional_chains

<ng-container *ngIf="isFirst ? first: isSecond ? second : third"></ng-container>

<ng-template #first></ng-template>
<ng-template #second></ng-template>
<ng-template #third></ng-template>

나는이 앞치마를 더 좋아한다.


0

<ion-row *ngIf="cat === 1;else second"></ion-row>
<ng-template #second>
    <ion-row *ngIf="cat === 2;else third"></ion-row>
</ng-template>
<ng-template #third>

</ng-template>

Angular는 우리가 항상 사용하는 많은 구조적 지시문 인 ngIf, ngFor 및 ngSwitch에서 이미 내부적으로 ng-template을 사용하고 있습니다.

> Angular의 ng-template이란?

https://www.angularjswiki.com/angular/what-is-ng-template-in-angular/


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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.