628

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

Sign up to request clarification or add additional context in comments.

10 Comments

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
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 I would do something like this: class="commonClass" ng-class={'class1' : expression, 'class2' : !expression}
@CodeHater thanks. That's pretty much what I'm planning now, just need to take a moment to fix up the CSS.
Is ng-class="{'class1' : expression1, 'class2':expression1 }" possible? Would you mind looking at my Question: stackoverflow.com/questions/25391692/…
|
63

For the ternary operator notation:

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

4 Comments

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.
using this method, can I add another expression?
@HikeNalbandyan yes you can add another expression too: ng-class="[expression1? 'class1 class2' : 'class3 class4', expression2 ? 'class5' : 'class6']"
If I have a fixed style "timeString" and an optional one to add, depending on a condition "disabledText" how do I write that ?
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 Comments

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.
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!
@kit can you pls help me here Similar SO
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>

Comments

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 Comments

If the class changes after render, is ng-class still listening for changes in className?
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.
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.
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 Comments

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 []?
As far as I know it is not possible. Also, it is not possible to put two ngClass directives on an element.
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
@jwg : you can combine two types of templates ans is here : stackoverflow.com/questions/29230732/…
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 Comments

I can't really remember. Isn't it logical though?
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.
6

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

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

Comments

6

With multiple conditions

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

Comments

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

Comments

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

Comments

1

I use this:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.