【问题标题】:AngularJS ngClass conditionalAngularJS ngClass 条件
【发布时间】:2013-05-07 22:41:55
【问题描述】:

有什么方法可以使ng-class 之类的表达式成为条件表达式?

例如,我尝试了以下方法:

<span ng-class="{test: 'obj.value1 == \'someothervalue\''}">test</span>

这段代码的问题是,无论obj.value1 是什么,类测试总是应用于元素。这样做:

<span ng-class="{test: obj.value2}">test</span>

只要obj.value2 不等于真值,则不应用该类。现在我可以通过这样做来解决第一个示例中的问题:

<span ng-class="{test: checkValue1()}">test</span>

checkValue1 函数如下所示:

$scope.checkValue1 = function() {
  return $scope.obj.value === 'somevalue';
}

我只是想知道ng-class 是否应该这样工作。我还在构建一个自定义指令,我想做类似的事情。但是,我找不到观看表达式的方法(也许这是不可能的,也是它这样工作的原因)。

这是一个plnkr 来说明我的意思。

【问题讨论】:

标签: html css angularjs


【解决方案1】:

您的第一次尝试几乎是正确的,它应该可以在没有引号的情况下工作。

{test: obj.value1 == 'someothervalue'}

这是plnkr

ngClass 指令适用于任何求真或假的表达式,有点类似于 Javascript 表达式,但有一些区别,您可以阅读here。 如果您的条件过于复杂,那么您可以使用返回真假的函数,就像您在第三次尝试中所做的那样。

只是为了补充:您还可以使用逻辑运算符来形成逻辑表达式,例如

ng-class="{'test': obj.value1 == 'someothervalue' || obj.value2 == 'somethingelse'}"

【讨论】:

  • 谢谢,不管出于什么原因,我认为因为这是一个作为对象值的表达式,所以整个东西必须用引号引起来。
  • ' 包装类名,否则如果你想添加更多类或者你的类有连字符或下划线,它将不起作用。 ng-class="{'test test-2: obj.value1 === 'value'}"
  • @Andrea,你忘记了结束语:ng-class="{'test test-2': obj.value1 === 'value'}"
  • 对于 Angular2(我试图找到)使用属性,例如:[class.test]="obj.value1 == 'someotervalue'"
  • 仅供读者参考,您也可以使用括号。 ng-class="{danger:!enabled || (type === 'WHEEL' &amp;&amp; !isOnline) }
【解决方案2】:

Angular 语法是使用 : 运算符来执行相当于 if 修饰符

<div ng-class="{ 'clearfix' : (row % 2) == 0 }">

将 clearfix 类添加到偶数行。尽管如此,表达式可以是我们在正常 if 条件下可以拥有的任何东西,它应该评估为真或假。

【讨论】:

  • 不错!此外,在 ng-repeat 中,您可以使用 $even 来设置类。例如。 ng-class="$ 偶数?'偶数':'奇数'"。 ng-repeat 中其他漂亮的布尔值是 $first、$last、$even、$odd...
【解决方案3】:

在 ng-repeat 中使用 ng-class

<table>
    <tbody>
            <tr ng-repeat="task in todos"
                ng-class="{'warning': task.status == 'Hold' , 'success': task.status == 'Completed',
              'active': task.status == 'Started', 'danger': task.status == 'Pending' } ">
                <td>{{$index + 1}}</td>
                <td>{{task.name}}</td>
                <td>{{task.date|date:'yyyy-MM-dd'}}</td>
                <td>{{task.status}}</td>
            </tr>
    </tbody>
</table>

对于 task.status 中的每个状态,行使用不同的类。

【讨论】:

    【解决方案4】:

    当有人必须运行复杂的逻辑来决定合适的 CSS 类时,使用带有 ng-class 的函数是一个不错的选择。

    http://jsfiddle.net/ms403Ly8/2/

    HTML:

    <div ng-app>
      <div ng-controller="testCtrl">
            <div ng-class="getCSSClass()">Testing ng-class using function</div>       
        </div>
    </div>
    

    CSS:

    .testclass { Background: lightBlue}
    

    JavaScript

    function testCtrl($scope) {
        $scope.getCSSClass = function() {
         return "testclass ";
      }     
    }
    

    【讨论】:

    • 我认为这混淆了人们的担忧。控制器应该更抽象,不关心 css 类,而是关心状态。根据状态,应该在模板中应用 css 类。这样控制器就独立于模板,更容易复用。
    【解决方案5】:

    Angular JSng-class Directive 中提供此功能。您可以在其中放置条件并分配条件类。您可以通过两种不同的方式实现这一目标。

    类型 1

    <div ng-class="{0:'one', 1:'two',2:'three'}[status]"></div>
    

    在此代码类中将根据 status

    的值应用

    如果 status 值为 0 则应用类 one

    如果 status 值为 1 则应用类 two

    如果 status 值为 2 则应用类 three


    类型 2

    <div ng-class="{1:'test_yes', 0:'test_no'}[status]"></div>
    

    status

    的值将应用于哪个类

    如果 status 的值为 1 或 true 那么它将添加类 test_yes

    如果 status 的值为 0 或 false 那么它将添加类 test_no

    【讨论】:

    • 这里的状态是什么?
    • Status 是您要根据要应用的类检查或验证的值。
    • 喜欢这种方式,因为它在处理多个值时更灵活且不那么疯狂
    • 如何将它用于多个类。比如,
    • 我们可以在这种情况下使用它吗:&lt;div ng-class="{'Image' || 'image': 'image-icon', 'Video' || 'video' || 'aVideo' || 'bVideo' : 'video-icon'}[resource.type]"&gt;&lt;/div&gt;
    【解决方案6】:

    我在上面看到了很好的示例,但它们都以大括号(json 映射)开头。另一种选择是根据计算返回结果。结果也可以是 css 类名列表(不仅仅是映射)。示例:

    ng-class="(status=='active') ? 'enabled' : 'disabled'"
    

    ng-class="(status=='active') ? ['enabled'] : ['disabled', 'alik']"
    

    说明:如果状态为活动,则将使用类enabled。否则,将使用 disabled 类。

    列表[] 用于使用多个类(不仅仅是一个)。

    【讨论】:

      【解决方案7】:

      我将向您展示两种可以动态应用 ng-class 的方法

      步骤一

      使用三元运算符

      <div ng-class="condition?'class1':'class2'"></div>
      

      输出

      如果您的条件为真,则将 class1 应用于您的元素,否则将应用 class2。

      缺点

      当您尝试在运行时更改条件值时,类不会以某种方式更改。因此,如果您有动态类更改等要求,我建议您进行第 2 步。

      第二步

      <div ng-class="{value1:'class1', value2:'class2'}[condition]"></div>
      

      输出

      如果您的条件与 value1 匹配,则 class1 将应用于您的元素,如果与 value2 匹配,则将应用 class2,依此类推。并且动态类更改可以很好地使用它。

      希望这会对你有所帮助。

      【讨论】:

        【解决方案8】:

        有一个简单的方法可以与 html 类属性和简写 if/else 一起使用。没必要把它弄得这么复杂。只需使用以下方法。

        <div class="{{expression == true ? 'class_if_expression_true' : 'class_if_expression_false' }}">Your Content</div>
        

        【讨论】:

          【解决方案9】:

          使用这个

          <div ng-class="{states}[condition]"></div>
          

          例如,如果条件为 [2 == 2],则状态为 {true: '...', false: '...'}

          <div ng-class="{true: 'ClassA', false: 'ClassB'}[condition]"></div>
          

          【讨论】:

          • 但如果我有 3 个或更多条件,这行不通?因为这只会返回真假条件
          • 条件表示真或假。你的意思是超过2个值的东西? @AlyAlAmeen
          【解决方案10】:

          对于 Angular 2,使用这个

          <div [ngClass]="{'active': dashboardComponent.selected_menu == 'mapview'}">Content</div>
          

          【讨论】:

          • 为了对此进行扩展,对于 Angular 2,您可以在 if/else 条件中应用一个类以及一个类修饰符,使用这样的数组:[ngClass]="['base-class', thread.isActive ? 'base-class--active' : '']"
          【解决方案11】:

          ng-class 是核心 AngularJs 的指令。您可以在其中使用“字符串语法”、“数组语法”、“求值表达式”、“三元运算符”以及下面描述的更多选项:

          ngClass 使用字符串语法

          这是使用 ngClass 最简单的方法。您只需将 Angular 变量添加到 ng-class,即用于该元素的类。

          <!-- whatever is typed into this input will be used as the class for the div below -->
          <input type="text" ng-model="textType">
          
          <!-- the class will be whatever is typed into the input box above -->
          <div ng-class="textType">Look! I'm Words!
          

          ngClass Using String Syntax的演示示例

          ngClass 使用数组语法

          这类似于字符串语法方法,只是您可以应用多个类。

          <!-- both input boxes below will be classes for the div -->
          <input type="text" ng-model="styleOne">
          <input type="text" ng-model="styleTwo">
          
          <!-- this div will take on both classes from above -->
          <div ng-class="[styleOne, styleTwo]">Look! I'm Words!
          

          ngClass 使用评估表达式

          使用 ngClass 的一种更高级的方法(您可能会使用最多的方法)是计算表达式。其工作方式是,如果变量或表达式的计算结果为 true,您可以应用某个类。如果没有,则不会应用该类。

          <!-- input box to toggle a variable to true or false -->
          <input type="checkbox" ng-model="awesome"> Are You Awesome?
          <input type="checkbox" ng-model="giant"> Are You a Giant?
          
          <!-- add the class 'text-success' if the variable 'awesome' is true -->
          <div ng-class="{ 'text-success': awesome, 'text-large': giant }">
          

          ngClass Using Evaluated Expression 示例

          ngClass 使用值

          这类似于评估表达式方法,不同之处在于您只能将多个值与唯一变量进行比较。

          <div ng-class="{value1:'class1', value2:'class2'}[condition]"></div>
          

          ngClass 使用三元运算符

          三元运算符允许我们使用速记来指定两个不同的类,一个表示表达式为真,一个表示假。以下是三元运算符的基本语法:

          ng-class="$variableToEvaluate ? 'class-if-true' : 'class-if-false'">
          

          评估第一个、最后一个或特定数字

          如果您正在使用ngRepeat 指令,并且希望将类应用于firstlast 或列表中的特定数字,则可以使用ngRepeat 的特殊属性。其中包括$first$last$even$odd 和其他一些。以下是如何使用这些的示例。

          <!-- add a class to the first item -->
          <ul>
            <li ng-class="{ 'text-success': $first }" ng-repeat="item in items">{{ item.name }}</li>
          </ul>
          
          <!-- add a class to the last item -->
          <ul>
            <li ng-class="{ 'text-danger': $last }" ng-repeat="item in items">{{ item.name }}</li>
          </ul>
          
          <!-- add a class to the even items and a different class to the odd items -->
          <ul>
            <li ng-class="{ 'text-info': $even, 'text-danger': $odd }" ng-repeat="item in items">{{ item.name }}</li>
          </ul>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-02
            相关资源
            最近更新 更多