Термінальний оператор в шаблонах AngularJS


239

Як зробити трійку з AngularJS (у шаблонах)?

Було б непогано використовувати деякі в атрибутах html (класи та стиль) замість створення та виклику функції контролера.

Відповіді:


374

Оновлення : Angular 1.1.5 додав потрійний оператор , тому тепер ми можемо просто написати

<li ng-class="$first ? 'firstRow' : 'nonFirstRow'">

Якщо ви використовуєте більш ранню версію Angular, ваші два варіанти:

  1. (condition && result_if_true || !condition && result_if_false)
  2. {true: 'result_if_true', false: 'result_if_false'}[condition]

пункт 2. вище створює об’єкт з двома властивостями. Синтаксис масиву використовується для вибору властивості з ім'ям true або властивості з ім'ям false та повернення пов'язаного значення.

Наприклад,

<li class="{{{true: 'myClass1 myClass2', false: ''}[$first]}}">...</li>
 or
<li ng-class="{true: 'myClass1 myClass2', false: ''}[$first]">...</li>

$ first встановлюється вірно всередині ng-повтору для першого елемента, тому вищезазначені застосовуватимуть клас 'myClass1' та 'myClass2' лише вперше через цикл.

Однак для ng-класу є простіший спосіб: ng-class приймає вираз, який повинен оцінювати по одному з наступних:

  1. рядок імен класів з обмеженим пробілом
  2. масив назв класів
  3. карта / об'єкт імен класів до булевих значень.

Приклад 1) наведено вище. Ось приклад 3, який, на мою думку, читається набагато краще:

 <li ng-class="{myClass: $first, anotherClass: $index == 2}">...</li>

Перший раз через цикл ng-повторів додається клас myClass. Третій раз через (індекс $ починається з 0) додається клас otherClass.

ng-style приймає вираз, який повинен оцінювати карту / об'єкт імен стилів CSS до значень CSS. Наприклад,

 <li ng-style="{true: {color: 'red'}, false: {}}[$first]">...</li>

6
Якби я міг би, я знову запросив би вас за оновлення питання!
Наррець

2
Я подбаю про це, @Narretz.
Ян Хантер

1
У прикладі доступу до об'єктного ключа ви можете пропустити клавішу "false", оскільки це завжди порожня рядок.
0xc0de

Слово попередження, 1.1.5 наразі не є стабільним.
Адам Грант

Що робити, якщо умовні зміни змінюються під час оновлення вашої моделі? Мені хотілося б ng-styleоновлення, але воно, схоже, оцінюється лише при вперше наданому елементі. (Кутовий ноб тут)
Хартлі Броди

86

Оновлення: Кутовий 1.1.5 додав потрійний оператор, ця відповідь правильна лише для версій, що передували 1.1.5. З 1.1.5 та пізніших версій див. Прийняту відповідь.

Перед кутовим 1.1.5:

Форма трикутника у angularjs така:

((condition) && (answer if true) || (answer if false))

Прикладом може бути:

<ul class="nav">
    <li>
        <a   href="#/page1" style="{{$location.path()=='/page2' && 'color:#fff;' || 'color:#000;'}}">Goals</a>
    </li>
    <li>
        <a   href="#/page2" style="{{$location.path()=='/page2' && 'color:#fff;' || 'color:#000;'}}">Groups</a>
    </li>
</ul>

або:

 <li  ng-disabled="currentPage == 0" ng-click="currentPage=0"  class="{{(currentPage == 0) && 'disabled' || ''}}"><a> << </a></li>

1
Дивно. Це не дуже інтуїтивно. Цікаво, чому це було реалізовано таким чином.
Бен Леш

4
Ternary ніколи не був впроваджений, але це просто використання двійкових операторів, як вони працюють.
Ендрю Джослін

18
@blesh, AngularJS сприяє прогнозуванню. Шаблони не повинні містити жодної логіки. Потрійний оператор у шаблоні повинен бути відновлений для виклику функції до контролера для кращої перевірки.
Marcello Nuccio

1
@ arg20 слід використовувати директиву ngClass (або ngClassEven і ngClassOdd). Потім покладіть всю логіку вибору класів css в контролер. Це набагато простіше перевірити автоматично.
Marcello Nuccio

1
@ arg20 Я сказав сказати, щоб це було в контролері, а не в моделі. Це не повинно бути проблемою. Однак у документації йдеться: "Результатом оцінки може бути рядок, що представляє імена класів, обмежених простором, масив або карта назв класів до булевих значень". Це означає, що ви можете використовувати "{cssclass: someBoolCheck ()}" як вираз, тобто ви ставите клас css у подання та логіку в контролер. Подивіться на приклад jsFiddle .
Marcello Nuccio

23

Для текстів у кутовому шаблоні ( userTypeє властивістю $ range, як $ range.userType):

<span>
  {{userType=='admin' ? 'Edit' : 'Show'}}
</span>

11

На сьогодні всі ми з'ясували, що версія 1.1.5 має функцію належного потрійця, $parseтому просто використовуйте цю відповідь як приклад фільтрів:

angular.module('myApp.filters', [])

  .filter('conditional', function() {
    return function(condition, ifTrue, ifFalse) {
      return condition ? ifTrue : ifFalse;
    };
  });

А потім використовувати його як

<i ng-class="checked | conditional:'icon-check':'icon-check-empty'"></i>

2
Я прийшов до цього питання для термального оператора, але наприкінці я пішов з фільтром, і він почувався дуже добре ... = D
slacktracer



0
  <body ng-app="app">
  <button type="button" ng-click="showme==true ? !showme :showme;message='Cancel Quiz'"  class="btn btn-default">{{showme==true ? 'Cancel Quiz': 'Take a Quiz'}}</button>
    <div ng-show="showme" class="panel panel-primary col-sm-4" style="margin-left:250px;">
      <div class="panel-heading">Take Quiz</div>
      <div class="form-group col-sm-8 form-inline" style="margin-top: 30px;margin-bottom: 30px;">

        <button type="button" class="btn btn-default">Start Quiz</button>
      </div>
    </div>
  </body>

Кнопка перемикає та змінює заголовок кнопки та показує / приховує подільну панель. Дивіться Плункр

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