AngularJS 템플릿의 if else 문


702

AngularJS 템플릿에서 조건을 만들고 싶습니다. Youtube API에서 비디오 목록을 가져옵니다. 일부 비디오는 16 : 9 비율이고 일부는 4 : 3 비율입니다.

다음과 같은 조건을 만들고 싶습니다.

if video.yt$aspectRatio equals widescreen then 
    element's attr height="270px"
else
    element's attr height="360px"

를 사용하여 동영상을 반복하고 있습니다 ng-repeat. 이 조건에 대해 어떻게해야할지 모릅니다.

  • 범위에 기능을 추가 하시겠습니까?
  • 템플릿으로합니까?

2
여기서 하나의 ng-if 기사를 찾았습니다. goo.gl/wQ30uf
virender

답변:


1284

Angularjs (1.1.5 이하 버전)는 if/else기능을 제공하지 않습니다 . 다음은 달성하려는 목표에 대해 고려해야 할 몇 가지 옵션입니다.

( 버전 1.1.5 이상을 사용하는 경우 아래 업데이트 (# 5)로 이동 )

1. 삼항 연산자 :

주석에서 @Kirk가 제안한 것처럼 가장 깨끗한 방법은 다음과 같이 삼항 연산자를 사용하는 것입니다.

<span>{{isLarge ? 'video.large' : 'video.small'}}</span>

2. ng-switch지시어 :

다음과 같은 것을 사용할 수 있습니다.

<div ng-switch on="video">
    <div ng-switch-when="video.large">
        <!-- code to render a large video block-->
    </div>
    <div ng-switch-default>
        <!-- code to render the regular video block -->
    </div>
</div>

3. ng-hide/ ng-show지시문

또는 사용할 수도 ng-show/ng-hide있지만이 옵션을 사용하면 실제로 큰 비디오와 작은 비디오 요소를 모두 렌더링 한 다음 ng-hide조건에 맞는 것을 숨기고 조건에 맞는 것을 표시합니다 ng-show. 따라서 각 페이지에서 실제로 두 개의 다른 요소를 렌더링하게됩니다.

4. 고려해야 할 또 다른 옵션은 ng-class지시어입니다.

다음과 같이 사용할 수 있습니다.

<div ng-class="{large-video: video.large}">
    <!-- video block goes here -->
</div>

위의 내용은 기본적으로 large-videodiv 요소에 CSS 클래스를 추가합니다 video.large.

업데이트 : Angular 1.1.5ngIf directive

5. ng-if지시어 :

위 버전에서는 지시문을 1.1.5사용할 수 있습니다 ng-if. 제공된 표현식이 리턴하면 요소를 제거하고 표현식이 리턴 하면 DOM false에를 다시 삽입 element합니다 true. 다음과 같이 사용할 수 있습니다.

<div ng-if="video == video.large">
    <!-- code to render a large video block-->
</div>
<div ng-if="video != video.large">
    <!-- code to render the regular video block -->
</div>

9
그것은해야한다 ng-switch on="video"대신ng-switch-on="video"
czerasz

4
어떻게합니까? if () {} else if () {} else if () {} else {} 그러나 한 요소에만 포함
falko

208
또한 삼항<span>{{isAdded ? 'Added' : 'Add to cart'}}</span>
커크 스트로 벡

16
명심 ng-if그 상태로 평가 될 때까지 DOM에 동봉 된 요소를 추가하지 않습니다 true달리 ng-hide하고 ng-show.
Wilhelm Murdoch 1

1
왜 간단하지 ng-switch="video"않습니까? 약간의 문제? 또는 이전에 사용할 수 없었습니까? 나를 위해 그것은 꽤 잘 작동합니다
Sami

175

최신 버전의 Angular (1.1.5 기준)에는이라는 조건부 지시문이 포함되어 있습니다 ngIf. 요소가 숨겨져 있지 않지만 DOM에 전혀 포함되지 않는다는 점 ngShow과 다릅니다 ngHide. 비용이 많이 들지만 사용되지 않는 구성 요소에 매우 유용합니다.

<div ng-if="video == video.large">
    <!-- code to render a large video block-->
</div>
<div ng-if="video != video.large">
    <!-- code to render the regular video block -->
</div>

5
명심 ng-if출시했다고 발표 고립 범위 , 그 때문에 $parent이된다 $parent.$parent본문에 ng-if.
David Salamon

142

Ternary가 가장 명확한 방법입니다.

<div>{{ConditionVar ? 'varIsTrue' : 'varIsFalse'}}</div>

호 또는 2 조건 으로이 작업을 수행합니까 ?? <div> {{A == B || A == C? 'varIsTrue': 'varIsFalse'}} </ div>
YoBre

2
그것을 감싸 라 (A == B || A == C)
Oliver Dixon

1
이 대답을 사랑하십시오! div가 조건을 만족하지 않으면 ng- 지시문을 사용하면 많은 HTML 공백이
생깁니다

48

Angular 자체는 if / else 기능을 제공하지 않지만 다음 모듈을 포함하면 얻을 수 있습니다.

https://github.com/zachsnow/ng-elif

그 자체로는 간단히 말해서 "제어 흐름 지시문의 간단한 모음 : ng-if, ng-else-if 및 ng-else"입니다. 사용하기 쉽고 직관적입니다.

예:

<div ng-if="someCondition">
    ...
</div>
<div ng-else-if="someOtherCondition">
    ...
</div>
<div ng-else>
    ...
</div>

1
div의 코드를 반복해서 반복하고 싶지 않습니다.

1
아무 것도 반복 할 필요가 없습니다 ng-if="someCondition && someOtherCondition". 쉽게 할 수 있습니다 . 아마도 내가 오해했을까요? (나는 그 모듈을 썼다 - 그것은처럼 작동합니다 ifelseJS에서).
Zach Snow

1
이것은 절대 생명의 은인입니다. 이것은 Angular 코어의 일부 여야하며 템플릿 코딩에 없어서는 안됩니다. 삼항 연산자를 사용하는 것보다 훨씬 깔끔하며 ng-switch가 표현식을 평가할 수 없다는 한계를 극복합니다.
니코 웨스터 데일

감사합니다 @NicoWesterdale! 또한 유용한 ng-switch 버전을 추가했습니다 : github.com/zachsnow/ng-cases
Zach Snow

30

video.yt$aspectRatio필터를 통해 속성을 전달하고 결과를 템플릿의 높이 속성에 바인딩 하여 속성을 직접 사용할 수 있습니다 .

필터는 다음과 같습니다.

app.filter('videoHeight', function () {
  return function (input) {
    if (input === 'widescreen') {
      return '270px';
    } else {
      return '360px';
    }
  };
});

그리고 템플릿은 다음과 같습니다.

<video height={{video.yt$aspectRatio | videoHeight}}></video>

video.yt$aspectRatio비어 있거나 정의되지 않은 코드 는 어떻습니까? 기본값을 적용 할 수 있습니까?
Fractaliste

13

이 경우 객체 속성에 따라 픽셀 값을 "계산"하려고합니다.

컨트롤러에서 픽셀 값을 계산하는 함수를 정의합니다.

컨트롤러에서 :


$scope.GetHeight = function(aspect) {
   if(bla bla bla) return 270;
   return 360;
}

그런 다음 템플릿에 다음과 같이 작성하십시오.


element height="{{ GetHeight(aspect) }}px "

11

삼항 이 매우 깨끗 하다는 데 동의합니다 . 비록 div 또는 p 또는 table을 표시 해야하는 것으로 매우 상황에 맞는 것처럼 보이므로 테이블을 사용하면 분명한 이유로 삼항을 선호하지 않습니다. 함수를 호출하는 것이 일반적으로 이상적이거나 필자의 경우이 작업을 수행했습니다.

<div ng-controller="TopNavCtrl">
        <div ng-if="info.host ==='servername'">
            <table class="table">
                <tr ng-repeat="(group, status) in user.groups">
                    <th style="width: 250px">{{ group }}</th>
                    <td><input type="checkbox" ng-model="user.groups[group]" /></td>
                </tr>
            </table>
        </div>
       <div ng-if="info.host ==='otherservername'">
            <table class="table">
                <tr ng-repeat="(group, status) in user.groups">
                    <th style="width: 250px">{{ group }}</th>
                    <td><input type="checkbox" ng-model="user.groups[group]" /></td>
                </tr>
            </table>
        </div>
</div>

4
    <div ng-if="modeldate==''"><span ng-message="required" class="change">Date is required</span> </div>

위와 같이 ng-if 지시문을 사용할 수 있습니다.


3

Angular의 가능성 : html 부분에 if-문을 포함시켜야했고, 생성하는 URL의 모든 변수가 정의되어 있는지 확인해야했습니다. 나는 다음과 같은 방식으로 그것을했고 유연한 접근 방식 인 것 같습니다. 누군가에게 도움이되기를 바랍니다.

템플릿의 html 부분 :

    <div  *ngFor="let p of poemsInGrid; let i = index" >
        <a [routerLink]="produceFassungsLink(p[0],p[3])" routerLinkActive="active">
    </div>

그리고 typescript 부분 :

  produceFassungsLink(titel: string, iri: string) {
      if(titel !== undefined && iri !== undefined) {
         return titel.split('/')[0] + '---' + iri.split('raeber/')[1];
      } else {
         return 'Linkinformation has not arrived yet';
      }
  }

감사와 안부


2
AngularJS보다 Angular처럼 보입니다.
pzaenger

@ pzaenger, 그렇습니다.하지만이 질문에 대한 많은 답변이 두 가지 모두에 효과적이므로 나 자신과 같은 일부 사람들은 대답을 봅니다. 괜찮 으시면 알려주십시오.
Jan Clemens Stoffregen

2
잘. 적어도 당신은 당신의 대답에 이것을 언급해야합니다.
pzaenger

@ pzaenger,이 힌트에 감사드립니다. 지금 언급했습니다.
Jan Clemens Stoffregen

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