提问



假设你有一个在ul中呈现的数组,每个元素都有li,控制器上的属性叫selectedIndex。在AngularJS中使用索引selectedIndexli添加类的最佳方法是什么?


我目前正在复制(手动)li代码并将类添加到li标签之一并使用ng-showng-hide仅显示一个li li]]每个索引。

最佳参考


如果你不想像我那样把CSS类名放到Controller中,这是我从v1之前开始使用的一个老技巧。我们可以编写一个直接评估类名选择的表达式,不需要自定义指令:


ng:class="{true:'selected', false:''}[$index==selectedIndex]"


请注意带冒号的旧语法。


还有一种新的更好的有条件地应用类的方法,例如:


ng-class="{selected: $index==selectedIndex}"


Angular现在支持返回对象的表达式。此对象的每个属性(名称)现在都被视为类名,并根据其值应用。


然而,这些方式在功能上并不相同。这是一个例子:


ng-class="{admin:'enabled', moderator:'disabled', '':'hidden'}[user.role]"


因此,我们可以通过基本上将模型属性映射到类名来重用现有的CSS类,同时将CSS类保留在Controller代码之外。

其它参考1


ng-class支持必须求值为[50]的表达式



  1. 一系列以空格分隔的类名,或

  2. 一个类名称数组,或

  3. 类名的映射/对象为布尔值。



所以,使用表格3)我们可以简单地写


ng-class="{'selected': $index==selectedIndex}"


另请参阅如何在AngularJS中有条件地应用CSS样式?为了更广泛的答案。





更新:Angular 1.1.5增加了对三元运算符的支持,所以如果你更熟悉这个结构:[52]


ng-class="($index==selectedIndex) ? 'selected' : ''"

其它参考2


我最喜欢的方法是使用三元表达式。


ng-class="condition ? 'trueClass' : 'falseClass'"


注意:如果您使用的是旧版本的Angular,请改用它,


ng-class="condition && 'trueClass' || 'falseClass'"

其它参考3


我会补充一点,因为其中一些答案似乎已经过时了。这就是我如何做到的:
点击


<class="ng-class:isSelected">


其中isSelected是在范围角度控制器中定义的javascript变量。
点击搜索结果
为了更具体地解决您的问题,请按照以下方式生成列表:
搜索结果


HTML



<div ng-controller="ListCtrl">  
    <li class="ng-class:item.isSelected" ng-repeat="item in list">   
       {{item.name}}
    </li>  
</div>


点击


JS



function ListCtrl($scope) {    
    $scope.list = [  
        {"name": "Item 1", "isSelected": "active"},  
        {"name": "Item 2", "isSelected": ""}
    ]
}


点击
见:http://jsfiddle.net/tTfWM/[53]


见:http://docs.angularjs.org/api/ng.directive:ngClass [54]

其它参考4


这是一个更简单的解决方案:




function MyControl($scope){
    $scope.values = ["a","b","c","d","e","f"];
    $scope.selectedIndex = -1;
    
    $scope.toggleSelect = function(ind){
        if( ind === $scope.selectedIndex ){
            $scope.selectedIndex = -1;
        } else{
            $scope.selectedIndex = ind;
        }
    }
    
    $scope.getClass = function(ind){
        if( ind === $scope.selectedIndex ){
            return "selected";
        } else{
            return "";
        }
    }
       
    $scope.getButtonLabel = function(ind){
        if( ind === $scope.selectedIndex ){
            return "Deselect";
        } else{
            return "Select";
        }
    }
}

.selected {
    color:red;
}

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script>
<div ng-app ng-controller="MyControl">
    <ul>
        <li ng-class="getClass($index)" ng-repeat="value in values" >{{value}} <button ng-click="toggleSelect($index)">{{getButtonLabel($index)}}</button></li>
    </ul>
    <p>Selected: {{selectedIndex}}</p>
</div>



我最近遇到了类似的问题,并决定只创建一个条件过滤器:


  angular.module('myFilters', []).
    /**
     * "if" filter
     * Simple filter useful for conditionally applying CSS classes and decouple
     * view from controller 
     */
    filter('if', function() {
      return function(input, value) {
        if (typeof(input) === 'string') {
          input = [input, ''];
        }
        return value? input[0] : input[1];
      };
    });


它需要一个参数,它可以是一个2元素的数组或一个字符串,它将变成一个附加空字符串作为第二个元素的数组:


<li ng-repeat="item in products | filter:search | orderBy:orderProp |
  page:pageNum:pageLength" ng-class="'opened'|if:isOpen(item)">
  ...
</li>

其它参考5


如果您想超越二进制评估并将CSS保留在控制器之外,您可以实现一个简单的过滤器,根据地图对象评估输入:


angular.module('myApp.filters, [])
  .filter('switch', function () { 
      return function (input, map) {
          return map[input] || '';
      }; 
  });


这允许您像这样编写标记:


<div ng-class="muppets.star|switch:{'Kermit':'green', 'Miss Piggy': 'pink', 'Animal': 'loud'}">
    ...
</div>

其它参考6


三元运算符刚刚添加到 1.1.5 中的角度解析器中。[55]


所以现在最简单的方法是:


ng:class="($index==selectedIndex)? 'selected' : ''"

其它参考7


我最近这样做是为了这样做:


<input type="password"  placeholder="Enter your password"
ng-class="{true: 'form-control isActive', false: 'isNotActive'}[isShowing]">


isShowing值是一个位于我的控制器上的值,只需单击一个按钮即可切换,单个括号之间的部分是我在css文件中创建的类。


编辑:我还想补充一点,codeschool.com有一个免费的课程,由谷歌在AngularJS上赞助,其中包括所有这些东西,然后是一些。没有必要支付任何费用,只需注册一个帐户即可开始!
祝大家好运!

其它参考8


我们可以创建一个函数来管理具有条件的返回类


[56]


<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) {
                    switch(strValue) {
                        case "It is Red":return "Red";break;
                        case "It is Yellow":return "Yellow";break;
                        case "It is Blue":return "Blue";break;
                        case "It is Green":return "Green";break;
                        case "It is Gray":return "Gray";break;
                    }
                }
        }]);
</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>





如果示例[57],您可以参考ng-class的完整代码页

其它参考9


我是Angular的新手,但我发现这可以解决我的问题:


<i class="icon-download" ng-click="showDetails = ! showDetails" ng-class="{'icon-upload': showDetails}"></i>


这将有条件地应用基于var的类。
它首先以图标 - 下载作为默认值,使用ng-class,我检查showDetails的状态true/false并应用类 icon-upload 即可。它的工作很棒。


希望能帮助到你。

其它参考10


它工作正常;)


<ul class="nav nav-pills" ng-init="selectedType = 'return'">
    <li role="presentation" ng-class="{'active':selectedType === 'return'}"
        ng-click="selectedType = 'return'"><a href="#return">return

    </a></li>
    <li role="presentation" ng-class="{'active':selectedType === 'oneway'}"
        ng-click="selectedType = 'oneway'"><a href="#oneway">oneway
    </a></li>
</ul>

其它参考11


这可能会被遗忘,但这里是我如何使用1.1.5的三元运算符来切换类,这取决于表中的行是第一行,中间行还是最后一行 - 除非在行中只有一行表:


<span class="attribute-row" ng-class="(restaurant.Attributes.length === 1) || ($first ? 'attribute-first-row': false || $middle ? 'attribute-middle-row': false || $last ? 'attribute-last-row': false)">
</span>

其它参考12


这是另一个选项,当不能使用ng-class时(例如在设置SVG样式时),该选项很有效:


ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"


(我认为你需要使用最新的不稳定Angular来使用ng-attr-,我目前正在使用1.1.4)

其它参考13


好吧,我建议您使用返回 true false 的函数检查控制器中的条件。


<div class="week-wrap" ng-class="{today: getTodayForHighLight(todayDate, day.date)}">{{day.date}}</div>


并在您的控制器中检查条件


$scope.getTodayForHighLight = function(today, date){
return (today == date);
}

其它参考14


部分



  <div class="col-md-4 text-right">
      <a ng-class="campaign_range === 'thismonth' ? 'btn btn-blue' :  'btn btn-link'" href="#" ng-click='change_range("thismonth")'>This Month</a>
      <a ng-class="campaign_range === 'all' ? 'btn btn-blue' :  'btn btn-link'" href="#" ng-click='change_range("all")'>All Time</a>
  </div>


控制器



  $scope.campaign_range = "all";
  $scope.change_range = function(range) { 
        if (range === "all")
        {
            $scope.campaign_range = "all"
        }
        else
        {  
            $scope.campaign_range = "thismonth"
        }
  };

其它参考15


这在我的工作中有条件地判断:


<li ng-repeat='eOption in exam.examOptions' ng-class="exam.examTitle.ANSWER_COM==exam.examTitle.RIGHT_ANSWER?(eOption.eoSequence==exam.examTitle.ANSWER_COM?'right':''):eOption.eoSequence==exam.examTitle.ANSWER_COM?'wrong':eOption.eoSequence==exam.examTitle.RIGHT_ANSWER?'right':''">
  <strong>{{eOption.eoSequence}}</strong> &nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;
  <span ng-bind-html="eOption.eoName | to_trusted">2020 元</span>
</li>

其它参考16


如果您使用角度 pre v1.1.5 (即没有三元运算符),您仍然需要一种等效的方法来设置两个条件中的值你可以这样做:


ng-class="{'class1':item.isReadOnly == false, 'class2':item.isReadOnly == true}"

其它参考17


如果您有一个应用于许多元素的公共类,您可以创建一个自定义指令,该指令将添加该类,如ng-show/ng-hide。


如果单击该按钮,该指令将向该按钮添加active类


module.directive('ngActive',  ['$animate', function($animate) {
  return function(scope, element, attr) {
    scope.$watch(attr.ngActive, function ngActiveWatchAction(value){
      $animate[value ? 'addClass' : 'removeClass'](element, 'active');
    });
  };
}]);


更多信息

其它参考18


经过多次搜索后,只需添加一些对我有用的东西......


<div class="form-group" ng-class="{true: 'has-error'}[ctrl.submitted && myForm.myField.$error.required]">


希望这有助于您的成功发展。


=)


未记载的表达式语法:Great Website Link ... =)[58]

其它参考19


检查
http://www.codinginsight.com/angularjs-if-else-statement/[59]


臭名昭着的angularjs if else声明!当我开始使用Angularjs时,我有点惊讶于我找不到if/else语句。


所以我正在研究一个项目,我注意到在使用if/else语句时,条件会在加载时显示。
您可以使用ng-cloak来解决此问题。


<div class="ng-cloak">
 <p ng-show="statement">Show this line</span>
 <p ng-hide="statement">Show this line instead</span>
</div>


.ng-cloak { display: none }


谢谢amadou

其它参考20


你可以使用这个npm包。它处理所有内容,并具有基于变量或函数的静态和条件类的选项。[60]


// Support for string arguments
getClassNames('class1', 'class2');

// support for Object
getClassNames({class1: true, class2 : false});

// support for all type of data
getClassNames('class1', 'class2', ['class3', 'class4'], { 
    class5 : function() { return false; },
    class6 : function() { return true; }
});

<div className={getClassNames({class1: true, class2 : false})} />