Додавання декількох класів за допомогою ng-класу


542

Чи можемо ми мати кілька виразів, щоб додати кілька ng-класів?

напр.

<div ng-class="{class1: expressionData1, class2: expressionData2}"></div>

Якщо так, чи може хтось прикласти приклад для цього.

.


17
Ваш приклад працює як є.
Стів Кльостер

Так, це так, я просто повинен був використовувати! Важливо в css, щоб зробити його видимим. Я знайшов це сам :)
Aditya Sethi

Що @stevuu сказав ... це ri8 ... ур питання - відповідь
YaswanthJg

Чи зазвичай значення expressData1 приймає значення true / false, або якесь фактично рядкове значення?
Martian2049

Відповіді:


978

Застосовувати різні класи, коли різні вирази оцінюють true:

<div ng-class="{class1 : expression1, class2 : expression2}">
    Hello World!
</div>

Щоб застосувати кілька класів, коли вираз має значення true:

<!-- notice expression1 used twice -->
<div ng-class="{class1 : expression1, class2 : expression1}">
    Hello World!
</div>

або просто:

<div ng-class="{'class1 class2' : expression1}">
    Hello World!
</div>

Зауважте одиничні цитати навколо класів css.


11
ви не можете передати кілька класів, таких як ng-class = "{'class1 class2': expression1}", просто перевірити це і зовсім не працювало, рішення, як @CodeHater сказав: "Застосовувати кілька класів, коли вираз відповідає": що зробив хитрість
d1jhoni1b

8
У 1.2.16, 'class1 class2': expressionздається, що багатокласний варіант ( ) працює добре, за винятком випадків, коли ви повторно використовуєте клас, він випадає, коли вираз перемикається між параметрами. Напр. З 'commonClass class1': expression == true, 'commonClass class2': expression == falsecommonClass втрачається, коли вираз переключається між істинним і хибним.
BrianS

10
@BrianS Я б зробив щось подібне:class="commonClass" ng-class={'class1' : expression, 'class2' : !expression}
ЗавждиALearner

@CodeHater спасибі Це майже все, що я зараз планую, просто потрібно зайняти хвилину, щоб виправити CSS.
BrianS

Чи ng-class="{'class1' : expression1, 'class2':expression1 }"можливо? Ви не заперечуєте , дивлячись на моє запитання: stackoverflow.com/questions/25391692 / ...
Danger14

48

Для позначення потрійного оператора:

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

Цей не працює для мене. <span ng-class = "params.isAdmin? 'fa fa-lock fa-2x': 'fa fa-unlock fa-2x'"> </span>. Консоль видасть помилку.
TommyQu

Використовуючи цей метод, чи можу я додати інший вираз?
Похід Налбандян

6
@HikeNalbandyan так, ви можете додати ще один вираз:ng-class="[expression1? 'class1 class2' : 'class3 class4', expression2 ? 'class5' : 'class6']"
mahi-man

47

Так, ви можете мати декілька виразів, щоб додати кілька класів до ng-класу.

Наприклад:

<div ng-class="{class1:Result.length==2,class2:Result.length==3}"> Dummy Data </div>

45

Тут неймовірно потужна альтернатива іншим відповідям:

ng-class="[  { key: resulting-class-expression }[ key-matching-expression ], ..  ]"

Деякі приклади:

1. Просто додайте до класу "class1 class2 class3":

<div ng-class="[{true: 'class1'}[true], {true: 'class2 class3'}[true]]"></div>

2. Додає класи "непарні" або "парні", щоб залежно від індексу $:

<div ng-class="[{0:'even', 1:'odd'}[ $index % 2]]"></div>

3. Динамічно створюється клас для кожного діла на основі $ index

<div ng-class="[{true:'index'+$index}[true]]"></div>

Якщо $index=5це призведе до:

<div class="index5"></div>

Ось зразок коду, який ви можете запустити:

var app = angular.module('app', []); 
app.controller('MyCtrl', function($scope){
  $scope.items = 'abcdefg'.split('');
}); 
.odd  { background-color: #eee; }
.even { background-color: #fff; }
.index5 {background-color: #0095ff; color: white; font-weight: bold; }
* { font-family: "Courier New", Courier, monospace; }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script>

<div ng-app="app" ng-controller="MyCtrl">
  <div ng-repeat="item in items"
    ng-class="[{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]]">
    index {{$index}} = "{{item}}" ng-class="{{[{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]].join(' ')}}"
  </div>
</div>


2
Блискуча відповідь! Я завжди використовував функції для більш складних ng-classдиректив, наприклад, коли мені потрібно було застосувати потрійний і стандартний вираз до того ж елемента. Я подав редакцію прийнятої відповіді, щоб включити використання масивів виразів.
Даніель Боннелл

Я не експерт з кутових питань, але, здається, ця конструкція: [{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]]може спроститись так ['index'+$index, {0:'even', 1:'odd'}[ $index % 2 ]]. Я щойно спробував це у Angular 1.5.9 і він працює :) Дякую за чудову відповідь!
vadipp

30

Використання a $scope метод на контролері, ви можете обчислити, які класи вивести у подання. Це особливо зручно, якщо у вас є складна логіка для обчислення імен класів, і це зменшить кількість логіки у вашому погляді, перемістивши його до контролера:

app.controller('myController', function($scope) {

    $scope.className = function() {

        var className = 'initClass';

        if (condition1())
            className += ' class1';

        if (condition2())
            className += ' class2';

        return className;
    };
});

а на погляд, просто:

<div ng-class="className()"></div>

1
Якщо клас змінюється після візуалізації, чи ng-клас все ще прослуховує зміни в className?
ремарш

3
ІМХО, сфера застосування повинна лише піддавати умові . ng-Визначити, який клас використовувати, коли ця умова буде виконана, має відповідати HTML- прив'язкам .
Альнітак

1
Це замінює атрибут класу в елементах dom. Якщо хтось використовує це, вони повинні включати класи, які не потребують умов у поверненому className.
phuwin

20

Ваш приклад працює для умовних класів (ім'я класу покаже, чи відповідає expressionDataXдійсності):

<div ng-class="{class1: expressionData1, class2: expressionData2}"></div>

Ви також можете додати кілька класів, що надаються користувачем елемента:

<div ng-class="[class1, class2]"></div>

Використання:

<div class="foo bar" class1="foo" class2="bar"></div>


3
Чи знаєте ви, чи можна комбінувати два типи шаблонів, тобто використовувати умовний клас із використанням класу, пов'язаного {}з даними []?
jwg

3
Наскільки я знаю, це неможливо. Крім того, неможливо поставити дві ngClassдирективи щодо елемента.
seldary

Дякую! Це, мабуть, підтверджено в інших місцях.
jwg

2
ви здивуєтеся: <a href="#/u/[[msg.from]]" ng-bind="msg.from" class="name, ng-class:[users[msg.from].nice, users[msg.from].star];" ng-class="{premium: users[msg.from].premium}"></a>і більше: scotch.io/tutorials/javascript/the-many-ways-to-use-ngclass
mayankcpdixit

1
@jwg: ви можете комбінувати два типи шаблонів. ans тут: stackoverflow.com/questions/29230732/…
satish kumar V

12

Ось приклад порівняння декількох станів кутового ui-маршрутизатора за допомогою АБО || оператор:

<li ng-class="
    {
        warning:
            $state.includes('out.pay.code.wrong')
            || $state.includes('out.pay.failed')
        ,
        active:
            $state.includes('out.pay')
    }
">

Це надасть класам li попередження та / або активність, залежно від того, чи виконуються умови.


Я справді не можу згадати. Хіба це не логічно?
нітех

Дякуємо вам за уточнення, що з одного блоку ng-класу можна застосувати кілька класів до тих пір, поки кожна їхня умова буде виконана.
cedricdlb

6

Нижче активного та активного меню - класи та itemCount, а ShowCart - значення вираження / булеві значення.

ng-class="{'active' : itemCount, 'activemenu' : showCart}"


4

Знайшов інший шлях завдяки Scotch.io

<div ng-repeat="step in steps" class="step-container step" ng-class="[step.status, step.type]" ng-click="onClick(step.type)">

Це була моя довідка. ПАТ


3

Інший спосіб ми можемо створити функцію для управління "використанням декількох класів"

CSS

 <style>
    .Red {
        color: Red;
    }
    .Yellow {
        color: Yellow;
    }
      .Blue {
        color: Blue;
    }
      .Green {
        color: Green;
    }
    .Gray {
        color: Gray;
    }
    .b {
         font-weight: bold;
    }
</style>

Сценарій

<script>
    angular.module('myapp', [])
            .controller('ExampleController', ['$scope', function ($scope) {
                $scope.MyColors = ['It is Red', 'It is Yellow', 'It is Blue', 'It is Green', 'It is Gray'];
                $scope.getClass = function (strValue) {
                    if (strValue == ("It is Red"))
                        return "Red";
                    else if (strValue == ("It is Yellow"))
                        return "Yellow";
                    else if (strValue == ("It is Blue"))
                        return "Blue";
                    else if (strValue == ("It is Green"))
                        return "Green";
                    else if (strValue == ("It is Gray"))
                        return "Gray";
                }
        }]);
</script>

Використовуючи його

<body ng-app="myapp" ng-controller="ExampleController">

<h2>AngularJS ng-class if example</h2>
<ul >
    <li ng-repeat="icolor in MyColors" >
        <p ng-class="[getClass(icolor), 'b']">{{icolor}}</p>
    </li>
</ul>

Ви можете, наприклад, звернутися до повної кодової сторінки в ng-class

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