якщо інше оператор у шаблонах AngularJS


702

Я хочу зробити умову в шаблоні AngularJS. Я отримую список відео з API 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функціональність. Нижче наведено кілька варіантів розгляду того, чого ви хочете досягти:

( Перейдіть до оновлення нижче (№5), якщо ви використовуєте версію 1.1.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-videoклас css елементу div, якщо він video.largeє truthy.

ОНОВЛЕННЯ: Кутовий 1.1.5 введеноngIf directive

5. ng-ifдиректива:

У наведених вище версіях 1.1.5ви можете використовувати ng-ifдирективу. Це видалило б елемент, якщо наданий вираз повернеться falseі повторно вставить elementв DOM, якщо вираз повернеться 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 {} Але включіть у dom лише один елемент
falko

208
Також <span>{{isAdded ? 'Added' : 'Add to cart'}}</span>
тернар

16
Майте на увазі, що ng-ifНЕ буде додавати вкладені елементи до DOM до тих пір, поки його стан не буде оцінено на trueвідміну від ng-hideта ng-show.
Вільгельм Мердок

1
Чому б не просто ng-switch="video"? Якась проблема? або вона була недоступна раніше? Для мене це працює досить добре
Самі

175

В останній версії Angular (станом на 1.1.5) вони включили умовну директиву під назвою ngIf. Він відрізняється від ngShowта ngHideтим, що елементи не приховані, але взагалі не включені до DOM. Вони дуже корисні для компонентів, які дорого створюються, але не використовуються:

<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.
Девід Саламон

142

Трінар - це найясніший спосіб зробити це.

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

Хо робити це з 2 умовою в або ?? як <div> {{A == B || A == C? 'varIsTrue': 'varIsFalse'}} </div>
YoBre

2
Загорніть його (A == B || A == C)
Олівер Діксон

1
люблю цю відповідь! Використання ng-директив дає багато пробілів у форматі html, якщо div не відповідає умові ..
sksallaj

48

Кутовий сам по собі не забезпечує функцію 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
я не хочу повторювати код у діві знову і знову.

1
Вам не потрібно нічого повторювати - ви могли так само легко зробити ng-if="someCondition && someOtherCondition". Можливо, я неправильно розумію? (Я написав цей модуль - він повинен працювати так само, як ifі elseв JS).
Зак Сніг

1
Це абсолютний рятівник. Це має бути частиною кутового ядра, воно незамінне в кодуванні шаблонів. Шлях чистіший, ніж тернарних операторів в усьому місці, і долає обмеження ng-комутатора не в змозі оцінити вирази.
Ніко Вестердейл

Дякую @NicoWesterdale! Крім того, я додав більш багату версію ng-перемикача, яка може бути вам корисною: 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він порожній чи невизначений? Чи можливо застосувати значення за замовчуванням?
Фракталіст

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: мені довелося включити вираз if - в html-частину, я повинен був перевірити, чи визначені всі змінні URL-адреси, яку я створюю, визначені. Я зробив це наступним чином і, здається, це гнучкий підхід. Я сподіваюся, що комусь це буде корисно.

Частина html у шаблоні:

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

І частина машинопису:

  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
Виглядає більше як Angular ніж AngularJS.
pzaenger

@pzaenger, так, але багато відповідей на це питання працюють і для обох, тому я думаю, що деякі люди, як я, дивляться на відповіді в будь-якому випадку. Будь ласка, дайте мені знати, якщо ви заперечуєте.
Ян Клеменс Стоффреген

2
Добре. Принаймні, ви повинні згадати це у своїй відповіді.
pzaenger

@pzaenger, дякую за цей підказку, я вже згадував про це.
Ян Клеменс Стоффреген

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.