ChatGPT解决这个技术问题 Extra ChatGPT

Adding multiple class using ng-class

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.

.

Your example works as-is.
Yes it does, I just had to use !important in css to make it visible. I found it by myself :)
What @stevuu said .. is ri8... ur question is answer
Does the value expressionData1 usually take on true/false, or some actually string value?

C
Community

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.


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/…
R
Razan Paul

For the ternary operator notation:

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

This one doesn't work for me. . 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 ?
K
Kit

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

index {{$index}} = "{{item}}" ng-class="{{[{true:'index'+$index}[true], {0:'even', 1:'odd'}[ $index % 2 ]].join(' ')}}"


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
S
Sumit Gupta

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>

A
Ahmad M

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>

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

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>


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.
Thanks! This seems to be confirmed elsewhere.
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/…
n
nitech

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.


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.
V
Vivek Panday

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

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

H
Hemakumar

With multiple conditions

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

G
Glorfindel

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


L
Lewis Hai

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


M
Manuel Villarroel

I use this:

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