Adding multiple class using ng-class
Asked Answered
N

12

622

ALERT: This thread is for the old AngularJS!

Can we have multiple expression to add multiple ng-class ?

for eg.

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

If yes can anyone put up the example to do so.

.

Namhoi answered 18/9, 2013 at 11:40 Comment(4)
Your example works as-is.Sissy
Yes it does, I just had to use !important in css to make it visible. I found it by myself :)Namhoi
What @stevuu said .. is ri8... ur question is answerAtom
Does the value expressionData1 usually take on true/false, or some actually string value?Larsen
D
1111

To apply different classes when different expressions evaluate to true:

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

To apply multiple classes when an expression holds true:

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

or quite simply:

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

Notice the single quotes surrounding css classes.

Driskill answered 18/9, 2013 at 12:5 Comment(10)
you can not pass multiple class like ng-class="{'class1 class2' : expression1}" just test that and did not worked at all, solution as @CodeHater said "To apply multiple classes when an expression holds true:" that made the trickMush
In 1.2.16 the multi-class option ('class1 class2': expression) seems to work fine, except that if you reuse a class it is dropped when the expression toggles between the options. E.g. with 'commonClass class1': expression == true, 'commonClass class2': expression == false commonClass is lost as the expression toggles between true and false.Fons
@Fons I would do something like this: class="commonClass" ng-class={'class1' : expression, 'class2' : !expression}Driskill
@CodeHater thanks. That's pretty much what I'm planning now, just need to take a moment to fix up the CSS.Fons
Is ng-class="{'class1' : expression1, 'class2':expression1 }" possible? Would you mind looking at my Question: #25392192Sycee
ng-class="{class1 : expression1, class2 : expression2}" condition is not working in safari.Visage
What version of angular is this for? It is not working for me.Lues
if you have a class name with hyphen in it, you have to use apostrophes around it, otherwise it's not going to work.Bilingual
Use ternary operator if you want to apply multiple class for the same condition for eg. [ngClass]="expression1 ? 'class1' : 'class2' "Bellyful
The space on the last example is what I was looking for. I thought it needed a comma.Supernal
T
61

For the ternary operator notation:

<div ng-class="expression1? 'class1 class2' : 'class3 class4'">
Theatrics answered 15/4, 2015 at 2:9 Comment(4)
This one doesn't work for me. <span ng-class="params.isAdmin?'fa fa-lock fa-2x':'fa fa-unlock fa-2x'"></span>. Console will throw error.Exsiccate
using this method, can I add another expression?Lucianolucias
@HikeNalbandyan yes you can add another expression too: ng-class="[expression1? 'class1 class2' : 'class3 class4', expression2 ? 'class5' : 'class6']"Edelweiss
If I have a fixed style "timeString" and an optional one to add, depending on a condition "disabledText" how do I write that ?Mosher
A
58

An incredibly powerful alternative to other answers here:

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

Some examples:

1. Simply adds 'class1 class2 class3' to the div:

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

2. Adds 'odd' or 'even' classes to div, depending on the $index:

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

3. Dynamically creates a class for each div based on $index

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

If $index=5 this will result in:

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

Here's a code sample you can run:

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>
Andromada answered 10/2, 2016 at 3:51 Comment(3)
Brilliant answer! I've always used functions for more complex ng-class directives, such as when I needed to apply a ternary and a standard expression on the same element. I've submitted an edit to the accepted answer to include the use of arrays of expressions.Ania
I'm not an Angular expert, but in seems that this construct: [{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]] can simplified like this ['index'+$index, {0:'even', 1:'odd'}[ $index % 2 ]]. I've just tried it in Angular 1.5.9 and it works :) Thanks for a great answer!Starfish
@kit can you pls help me here Similar SOSubtropical
T
48

Yes you can have multiple expression to add multiple class in ng-class.

For example:

<div ng-class="{class1:Result.length==2,class2:Result.length==3}"> Dummy Data </div>
Transport answered 25/11, 2013 at 10:2 Comment(0)
G
30

Using a $scope method on the controller, you can calculate what classes to output in the view. This is especially handy if you have a complex logic for calculating class names and it will reduce the amount of logic in your view by moving it to the controller:

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

    $scope.className = function() {

        var className = 'initClass';

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

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

        return className;
    };
});

and in the view, simply:

<div ng-class="className()"></div>
Georgia answered 22/10, 2014 at 12:32 Comment(3)
If the class changes after render, is ng-class still listening for changes in className?Lipase
IMHO, the scope should only expose the condition. It should be up to the HTML ng- bindings to determine what class to use when that condition is met.Drysalter
This overwrites the class attribute in dom elements. If one uses this, they have to include the classes that don't need conditions in the returned className.Dumuzi
R
23

Your example works for conditioned classes (the class name will show if the expressionDataX is true):

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

You can also add multiple classes, supplied by the user of the element:

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

Usage:

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

Recap answered 13/2, 2014 at 8:51 Comment(4)
Do you know if it is possible to combine the two types of template, ie have a conditional class using {} and a data-bound class using []?Waiver
As far as I know it is not possible. Also, it is not possible to put two ngClass directives on an element.Recap
you'll be surprised: <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> and more: scotch.io/tutorials/javascript/the-many-ways-to-use-ngclassNocturnal
@Waiver : you can combine two types of templates ans is here : #29231232Gnu
O
12

Here is an example comparing multiple angular-ui-router states using the OR || operator:

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

It will give the li the classes warning and/or active, depening on whether the conditions are met.

Oxen answered 24/3, 2014 at 8:58 Comment(2)
I can't really remember. Isn't it logical though?Oxen
Thank you for clarifying that multiple classes can be applied from the same ng-class block, as long as each of their conditions are satisfied.Conlen
H
6

Below active and activemenu are classes and itemCount and ShowCart is expression/boolean values.

ng-class="{'active' : itemCount, 'activemenu' : showCart}"
Holliman answered 16/5, 2015 at 18:49 Comment(0)
P
6

With multiple conditions

<div ng-class="{'class1' : con1 || can2, 'class2' : con3 && con4}">
Hello World!
</div>
Parttime answered 28/10, 2015 at 7:5 Comment(0)
F
5

Found another way thanks to Scotch.io

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

This was my reference.PATH

Flop answered 16/12, 2016 at 23:15 Comment(0)
L
3

Other way we can create a function to control "using multiple class"

CSS

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

Script

<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>

Using it

<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>

You can refer to full code page at ng-class if example

Lurlinelusa answered 22/9, 2015 at 10:17 Comment(0)
W
1

I use this:

[ngClass]="[{
    'basic':'mat-basic-button', 
    'raised':'mat-raised-button', 
    'stroked':'mat-stroked-button'
}[ 
    button.style ?? 'raised'
]]"
Wingfooted answered 1/5, 2022 at 15:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.