web-dev-qa-db-fra.com

angular ng-class if-else expression

J'utilise angularjs ng-class de la manière suivante:

<div class="bigIcon" data-ng-click="PickUp()" 
ng-class="{first:'classA', second:'classB', third:'classC', fourth:'classC'}[call.State]"/>

et je me suis demandé si je pouvais utiliser l'expression if-else, puis-je faire quelque chose de similaire à ceci:

<div class="bigIcon" data-ng-click="PickUp()" 
ng-class="{first:'classA', second:'classB', else:'classC'}[call.State]"/>

signifiant à chaque fois que call.State est différent de first ou second utilise classC et ne spécifie pas chaque valeur.

merci!

240
Dor Cohen

Utilisez des instructions if-then imbriquées en ligne (opérateurs ternaires)

<div ng-class=" ... ? 'class-1' : ( ... ? 'class-2' : 'class-3')">

par exemple:

<div ng-class="apt.name.length >= 15 ? 'col-md-12' : (apt.name.length >= 10 ? 'col-md-6' : 'col-md-4')">
    ...
</div>

Et assurez-vous qu'il est lisible par vos collègues :)

501
Jossef Harush

vous pouvez essayer en utilisant une fonction comme celle-ci:

<div ng-class='whatClassIsIt(call.State)'>

Ensuite, placez votre logique dans la fonction elle-même:

    $scope.whatClassIsIt= function(someValue){
     if(someValue=="first")
            return "ClassA"
     else if(someValue=="second")
         return "ClassB";
     else
         return "ClassC";
    }

J'ai fait un violon avec un exemple: http://jsfiddle.net/DotDotDot/nMk6M/

104
DotDotDot

J'étais dans une situation où j'avais besoin de deux déclarations "si" qui pouvaient être vraies et d'un "autre" ou par défaut si aucune n'était vraie.

ng-class="{'class-one' : value.one , 'class-two' : value.two}" class="else-class"

Où value.one et value.two sont vrais, ils ont priorité sur la classe .else

61
joel.bowen

Clairement ! Nous pouvons créer une fonction pour renvoyer un nom de classe CSS avec l'exemple suivant. enter image description here

CSS

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

JS

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

Puis

<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>
<hr/>
<p>Other way using : ng-class="{'class1' : expression1, 'class2' : expression2,'class3':expression2,...}"</p>
<ul>
    <li ng-repeat="icolor in MyColors">
        <p ng-class="{'Red':icolor=='It is Red','Yellow':icolor=='It is Yellow','Blue':icolor=='It is Blue','Green':icolor=='It is Green','Gray':icolor=='It is Gray'}" class="b">{{icolor}}</p>
    </li>
</ul>

Vous pouvez vous référer à la page de code complète à l’adresse exemple: ng-class

13
Lewis Hai

Les solutions ci-dessus ne fonctionnaient pas pour moi pour les cours avec des images d'arrière-plan. Ce que j’ai fait c’est que j’ai créé une classe par défaut (celle dont vous avez besoin d’autre) et mis class = "defaultClass" puis ng-class = "{class1: abc, class2: xyz}"

<span class="booking_warning" ng-class="{ process_success: booking.bookingStatus == 'BOOKING_COMPLETED' || booking.bookingStatus == 'BOOKING_PROCESSED', booking_info: booking.bookingStatus == 'INSTANT_BOOKING_REQUEST_RECEIVED' || booking.bookingStatus == 'BOOKING_PENDING'}"> <strong>{{booking.bookingStatus}}</strong> </span>

P.S: Les classes en condition doivent remplacer la classe par défaut, c'est-à-dire marquée! Important

3
Kazim Homayee

C’est le meilleur moyen fiable de le faire. Voici un exemple simple et vous pourrez ensuite développer votre logique personnalisée:

//In .ts
public showUploadButton:boolean = false;

if(some logic)
{
    //your logic
    showUploadButton = true;
}

//In template
<button [class]="showUploadButton ? 'btn btn-default': 'btn btn-info'">Upload</button>
1

Une de mes solutions consiste à manipuler une variable de modèle uniquement pour le basculement de la classe ng:

Par exemple, je souhaite changer de classe en fonction de l'état de ma liste:

1) Chaque fois que ma liste est vide, je mets à jour mon modèle:

$scope.extract = function(removeItemId) {
    $scope.list= jQuery.grep($scope.list, function(item){return item.id != removeItemId});
    if (!$scope.list.length) {
        $scope.liststate = "empty";
    }
}

2) Chaque fois que ma liste n'est pas vide, je mets un autre état

$scope.extract = function(item) {
    $scope.list.Push(item);
    $scope.liststate = "notempty";
}

3) Quand ma liste n'est jamais touchée, je veux donner une autre classe (c'est ici que la page est lancée):

$scope.liststate = "init";

3) J'utilise ce modèle supplémentaire sur ma classe ng:

ng-class="{'bg-empty': liststate == 'empty', 'bg-notempty': liststate == 'notempty', 'bg-init': liststate = 'init'}"
0
Bahadir Tasdemir