Возможно ли иметь несколько отдельных тернарных выражений в ng-классе для элемента?

Я пытаюсь объединить следующие два тернарных выражения ng-class в один ng-class (поэтому я могу контролировать цвет, через классы btn-success/danger и ширину, через width-small/medium/wide класс, моей кнопки divs

<div class="btn" ng-class="(rate > 0) ? 'btn-success' : 'btn-danger'">{{rate}}</div>
<div class="btn" ng-class="(priority == 'low') ? 'width-small' : (priority == 'medium') ? 'width-medium' : 'width-wide'">{{rate}}</div>

Я понимаю, что могу просто что-то делать по строкам ниже; однако я хотел бы использовать тернарные выражения, доступные в 1.1.5

<div class="btn" ng-class="{'btn-success': rate > 0, 'btn-danger': rate <= 0, 'width-small': priority == 'low', 'width-medium': priority == 'medium', 'width-wide': prioity == 'high'}">{{rate}}</div>

Пространство, разделяющее выражения, не работало для меня, а также не разделяло запятую внутри ng-class

Спасибо заранее за помощь в определении того, как и как иметь несколько тернарных выражений в одном ng-class

Ответы

Ответ 1

Для тех, кто ищет ответ: Да, это действительно возможно, также как упоминалось, читаемость сомнительна.

<div ng-class="(conversation.read ? 'read' : 'unread') + ' ' + (conversation.incoming ? 'in' : 'out')"></div>

Из документации ngClass:

Директива работает по-разному, в зависимости от того, из какого из трех типов выражение выражается:

  • Если выражение оценивается как строка, строка должна быть одним или > большим количеством имен разделенных пробелами.

  • Если выражение оценивает массив, каждый элемент массивa > должен > быть строкой, которая представляет собой одно или несколько имен классов с разделителями по размеру.

  • Если выражение оценивает объект, то для каждой пары "ключ-значение" > объекта с истинным значением соответствующий ключ используется как имя класса.

Здесь применим вариант 1.

Из моего понимания, используя этот метод, вы получите 2 часа, в то время как использование нотации объектов приведет к 4, но я могу ошибаться в этом.

Ответ 2

Я думаю, вы предпочли бы использовать filter. Вы можете написать фильтр rateToClass, который будет содержать логику и преобразовать вашу скорость в имени класса, которое вы хотите.

Вы также можете поместить функцию rateToClass (rate) в свою область действия, но она уродлива.

Если вы настаиваете на своей логике в представлении, ng-class поддерживать несколько классов с помощью объекта (см. официальный пример официального документа, строка 7):

<p ng-class="{strike: strike, bold: bold, red: red}">Map Syntax Example</p>

У вас может быть более сложное выражение, например ng-class='{btn-success: rate > 0} '.

Ответ 3

Можно добавить несколько троичных выражений в одну директиву ng-класса, поместив каждое из выражений в массив как элементы этого массива.

Пример:

<div ng-class="[
    expression1 ? 'class1' : 'class2',
    expression2 ? 'class3' : 'class4'
]">

Ответ 4

Если вы используете более раннюю версию Angular, ваши два варианта:

(условие & result_if_true ||! условие && result_if_false) {true: 'result_if_true', false: 'result_if_false'} [условие] Элемент 2. выше создает объект с двумя свойствами. Синтаксис массива используется для выбора свойства с именем true или с именем с именем false и возвратом связанного значения.

например.

...  или ... $ first устанавливается в true внутри ng-repeat для первого элемента, поэтому выше будет применяться класс 'myClass1' и 'myClass2' только в первый раз через цикл.

С ng-классом существует более простой способ: ng-класс принимает выражение, которое должно оцениваться одним из следующих:

строка имен классов с разделителями пространства массив имен классов map/object имен классов для булевых значений. Пример 1) был приведен выше. Вот пример из 3, который, по моему мнению, читается намного лучше:

... В первый раз через цикл ng-repeat добавлен класс myClass. 3-й раз (значение $index начинается с 0), добавляется класс anotherClass.

ng-style принимает выражение, которое должно оценивать к карте/объекту имен стиля CSS в значениях CSS. Например.

...