【问题标题】:AngularJS ng-class if-else expressionAngularJS ng-class if-else 表达式
【发布时间】:2013-08-11 13:45:26
【问题描述】:

对于AngularJS,我使用ng-class的方式如下:

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

我想知道是否可以使用if-else 表达式来做类似的事情:

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

所以每当call.State 不同于firstsecond 时使用classC 并避免指定每个值?

【问题讨论】:

    标签: angularjs ng-class


    【解决方案1】:

    使用嵌套的内联 if-then 语句 (Ternary Operators)

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

    例如:

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

    并确保它您的同事可以阅读 :)

    【讨论】:

    • 如果我需要添加两个类怎么办?
    • 对不起,我的意思是“如果是这样的话,那就是一个类,如果是这样的话,是另一个类”。两个班级,两种不同的条件。
    • @mircobabini, ng-class="{'class1': ##condition1## , 'class2': ##condition2## }" 如您在上面的问题中所见
    • 这不是我想在视图中看到的。视图的逻辑太多了。
    • @Zehelvion 我不得不不同意。这是视图逻辑。您不希望指定在控制器或服务中使用哪个列类。这是应该的。
    【解决方案2】:

    您可以尝试使用类似的功能:

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

    然后将你的逻辑放入函数本身:

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

    我做了一个例子:http://jsfiddle.net/DotDotDot/nMk6M/

    【讨论】:

    • 这是一个比嵌套三元运算符更好的解决方案
    • 爱它。这使 html 比简单的 ng-class 条件更清晰。
    • 这种方法的问题是你现在让控制器知道 CSS 类。不是一个好方法。在控制器中设置变量,然后根据变量确定在 HTML 中使用哪个类是更好的解决方案。
    • 这只是一个关于如何做到这一点的提示,这个问题很简单,可以用三元运算符来处理,但是当你需要更多逻辑时,你不想在 HTML 中这样做直接,最快的解决方案之一是,就像我做的那样,在控制器中使用一个函数(如果你不希望控制器知道 CSS,你也可以观察和设置一个范围变量并使用HTML 中基于该值的条件)。但是,如果你有更多的逻辑,或者很多重复,把它放在一个指令中,它应该更干净。该示例主要是关于不在 HTML 中添加逻辑
    • 如果您需要为超过 2 或 3 个不同的类添加条件,则优于三元运算符,请将 html 与逻辑分开 :)
    【解决方案3】:

    我遇到过一种情况,我需要两个“if”语句,它们都可以为真,如果两者都不为真,则为“else”或默认值,不确定这是否是对 Jossef 答案的改进,但对我来说似乎更清晰:

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

    当 value.one 和 value.two 为真时,它们优先于 .else-class

    【讨论】:

      【解决方案4】:

      很明显!我们可以通过以下完整示例创建一个函数来返回 CSS 类名。

      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>
      

      然后

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

      您可以参考ng-class if example的完整代码页

      【讨论】:

        【解决方案5】:

        上述解决方案对我来说不适用于带有背景图像的课程。我所做的是我创建了一个默认类(你需要的那个)并设置 class='defaultClass' 然后 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:有条件的类应该覆盖默认类,即标记为!重要

        【讨论】:

          【解决方案6】:

          这是执行此操作的最佳且可靠的方法。 这是一个简单的示例,之后您可以开发自定义逻辑:

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

          【讨论】:

            【解决方案7】:

            我的一种解决方法是为 ng 类切换操作模型变量:

            例如,我想根据我的列表的状态来切换类:

            1) 每当我的列表为空时,我都会更新我的模型:

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

            2) 每当我的列表不为空时,我都会设置另一个状态

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

            3)当我的列表从未被触及时,我想再给一个班级(这是页面启动的地方):

            $scope.liststate = "init";
            

            3) 我在我的 ng-class 上使用这个附加模型:

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

            【讨论】:

              【解决方案8】:

              这样使用:

                  <div [ngClass]="{cssClass A: condition 1, cssClass B: condition 2, cssClass C: condition 3}">...</div>
              

              【讨论】:

                【解决方案9】:

                你可以试试这个方法:

                </p><br /><br />
                <p>ng-class="{test: obj.value1 == 'someothervalue' || obj.value2 == 'somethingelse'}<br /><br /><br />
                
                ng-class="{test: obj.value1 == 'someothervalue' || obj.value2 == 'somethingelse'}
                

                您可以从here获得完整的详细信息。

                【讨论】:

                  猜你喜欢
                  • 2023-03-27
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-05-11
                  • 2017-08-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-01-22
                  相关资源
                  最近更新 更多