AngularJS перемикає клас за допомогою ng-класу


217

Я намагаюся переключити клас елемента за допомогою ng-class

<button class="btn">
  <i ng-class="{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}"></i>
</button>

isAutoScroll ():

$scope.isAutoScroll = function()
{
    $scope.autoScroll = ($scope.autoScroll) ? false : true;
    return $scope.autoScroll;
}

В основному, якщо $scope.autoScrollце правда, я хочу, щоб клас ng був, icon-autoscrollа якщо його помилковим, я хочу, щоб він бувicon-autoscroll-disabled

Те, що я зараз не працює, створює цю помилку в консолі

Error: Lexer Error: Unexpected next character at columns 18-18 [?] in expression [{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}].

Як правильно це зробити?

EDIT

рішення 1: (застаріле)

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>
</button>

EDIT 2

рішення 2:

Я хотів оновити рішення, оскільки Solution 3, надане Стюі, повинно бути таким, яке використовувалося. Це найбільш стандартно, якщо мова йде про потрійний оператор (і мені це найлегше читати). Рішення було б

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>
</button>

перекладається на:

if (autoScroll == true) ?// використовувати клас 'icon-autoscroll' :// else use'icon-autoscroll-disabled'


не може використовувати умовні умови в angular expressionsdocs => Немає звітів про контрольний потік: у кутовому виразі ви не можете виконати будь-якого з наступних дій: conditionals, циклі або кидати. Використовуйте іншу функцію чи директиву
charlietfl

@Ronnie Я бачив ваше рішення, і це було так круто. але мені цікаво, чому autoScrollтут буде просто діяти в кожній кнопці? (Я тестував це за допомогою декількох кнопок, і це також добре працює) Я маю на увазі, коли натискаю кожну кнопку, вона впливає саме на цю кнопку, а не на всі кнопки.
zx1986

Відповіді:


436

Як використовувати умовне в ng-класі:

Рішення 1:

<i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>

Рішення 2:

<i ng-class="{true: 'icon-autoscroll', false: 'icon-autoscroll-disabled'}[autoScroll]"></i>

Рішення 3 (кутова v.1.1.4 + введена підтримка потрійного оператора):

<i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>

Плункер


3
Другий приклад є більш чистим, але смішно, що ви не можете поставити змінну, яку ви оцінюєте, на передній частині виразу ... вона просто читається смішно. Уявіть, що на вираз дивитесь як на твердження if: "if (змінний) true: do this, false: do this ... ugh #fullynerdy
mattdlockyer

10
@Stewie Faaakin чудовий товариш, люби, як це виглядає реальний код, а не якась баштадизована розмітка виразів: D
mattdlockyer

Справді оцінювати значення спочатку досить корисно, оскільки це дозволяє уникнути випадкового призначення змінної нового значення.
Lharby

Ternary - це саме те, що я шукав. Хороша робота з наданням трьох прикладів із деталями підтримки версії.
TaeKwonJoe

13

Як альтернативне рішення, засноване на логічному операторі javascript '&&', яке повертає останню оцінку, ви також можете зробити це так:

<i ng-class="autoScroll && 'icon-autoscroll' || !autoScroll && 'icon-autoscroll-disabled'"></i>

Це лише трохи коротший синтаксис, але мені легше читати.


10

Додайте більше одного класу на основі умови:

<div ng-click="AbrirPopUp(s)" 
ng-class="{'class1 class2 class3':!isNew, 
           'class1 class4': isNew}">{{ isNew }}</div>

Застосувати: class1 + class2 + class3, коли isNew = false ,

Застосувати: class1 + class4, коли isNew = true


6
<div data-ng-init="featureClass=false" 
     data-ng-click="featureClass=!featureClass" 
     data-ng-class="{'active': featureClass}">
    Click me to toggle my class!
</div>

Аналогічно toggleClassметоду jQuery , це спосіб activeувімкнення / вимкнення класу при натисканні на елемент.


2
Чи можете ви надати трохи більше інформації щодо своєї відповіді англійською? Чим він відрізняється від відповідей, які вже є тут?
Онот

2
Я не впевнений, чому ця відповідь має багато негативних голосів ?? Це рішення, яке насправді працювало для мене краще, ніж інші вище ...
Пауло Гріеттнер

2
Я думаю, що опис погано написаний, і люди реагують на слово "jQuery". Що в описі мається на увазі "Це аналог функції toggleClass в JQuery". BTW, чи потрібно вам вводити змінну?
Дизайн Адріана

1

в контролері буде визначено та змінено автоскролл.

<span ng-class= "autoscroll?'class_if_true':'class_if_false'"></span>

Додайте кілька класів на основі умови:

<span ng-class= "autoscroll?'first second third':'classes_if_false'"></span>


-1

Я зробив цю роботу таким чином:

<button class="btn" ng-click='toggleClass($event)'>button one</button>
<button class="btn" ng-click='toggleClass($event)' >button two</button>

// у вашому контролері

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }

2
Хоча це працює, ви змішуєте кутовий і jQuery. Ви повинні намагатися уникати цього, якщо можете. Що спочатку запитували, можна зробити без події клацання. Що робити, якщо у вас є інша кнопка, яка повинна перемикати цей клас на вашу кнопку вище? Зараз оновлення не буде оновлено, оскільки ви змінюєте його натисканням, а не через ng-class
Ronnie


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