626

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.

.

4
  • 20
    Your example works as-is. Commented Sep 18, 2013 at 11:45
  • 1
    Yes it does, I just had to use !important in css to make it visible. I found it by myself :) Commented Sep 19, 2013 at 5:53
  • What @stevuu said .. is ri8... ur question is answer
    – YaswanthJg
    Commented Sep 4, 2015 at 6:00
  • Does the value expressionData1 usually take on true/false, or some actually string value? Commented Sep 12, 2016 at 14:41

12 Answers 12

1119

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.

10
  • 18
    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 trick
    – jonbarlo
    Commented Jul 14, 2014 at 22:51
  • 10
    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.
    – BrianS
    Commented Aug 1, 2014 at 18:03
  • 10
    @BrianS I would do something like this: class="commonClass" ng-class={'class1' : expression, 'class2' : !expression} Commented Aug 3, 2014 at 9:15
  • @CodeHater thanks. That's pretty much what I'm planning now, just need to take a moment to fix up the CSS.
    – BrianS
    Commented Aug 4, 2014 at 1:15
  • Is ng-class="{'class1' : expression1, 'class2':expression1 }" possible? Would you mind looking at my Question: stackoverflow.com/questions/25391692/…
    – Danger14
    Commented Aug 19, 2014 at 19:44
62

For the ternary operator notation:

<div ng-class="expression1? 'class1 class2' : 'class3 class4'">
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.
    – TommyQu
    Commented Aug 3, 2017 at 20:12
  • using this method, can I add another expression? Commented Aug 14, 2017 at 9:19
  • 14
    @HikeNalbandyan yes you can add another expression too: ng-class="[expression1? 'class1 class2' : 'class3 class4', expression2 ? 'class5' : 'class6']"
    – mahi-man
    Commented Aug 21, 2017 at 23:05
  • If I have a fixed style "timeString" and an optional one to add, depending on a condition "disabledText" how do I write that ? Commented Aug 27, 2021 at 15:40
60

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>

3
  • 2
    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. Commented Aug 19, 2016 at 19:05
  • 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!
    – vadipp
    Commented Mar 12, 2019 at 10:59
  • @kit can you pls help me here Similar SO Commented Dec 15, 2020 at 4:36
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>
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>
3
  • 1
    If the class changes after render, is ng-class still listening for changes in className?
    – remarsh
    Commented Sep 30, 2015 at 17:56
  • 3
    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.
    – Alnitak
    Commented Feb 18, 2016 at 11:46
  • 1
    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.
    – phuwin
    Commented Jan 18, 2017 at 9:20
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>

4
  • 3
    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 []?
    – jwg
    Commented Oct 27, 2014 at 9:55
  • 4
    As far as I know it is not possible. Also, it is not possible to put two ngClass directives on an element.
    – seldary
    Commented Oct 27, 2014 at 10:01
  • 2
    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-ngclass Commented Dec 6, 2014 at 19:29
  • 1
    @jwg : you can combine two types of templates ans is here : stackoverflow.com/questions/29230732/… Commented Mar 24, 2015 at 11:36
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.

2
  • I can't really remember. Isn't it logical though?
    – nitech
    Commented Sep 13, 2016 at 6:58
  • 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.
    – cedricdlb
    Commented Jan 30, 2017 at 19:10
6

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

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

With multiple conditions

<div ng-class="{'class1' : con1 || can2, 'class2' : con3 && con4}">
Hello World!
</div>
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

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

1

I use this:

[ngClass]="[{
    'basic':'mat-basic-button', 
    'raised':'mat-raised-button', 
    'stroked':'mat-stroked-button'
}[ 
    button.style ?? 'raised'
]]"

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.