AngularJs - 在点击上添加活动类的最佳实践(ng-repeat)

Aim*_*sni 38 javascript html5 angularjs

我想在列表中单击添加活动类,我尝试了以下代码,但它在我的所有项目上添加了活动类:/:

HTML:

<div class="filters_ct" ng-controller="selectFilter">
    <ul>
        <li ng-repeat="filters in filter"  ng-click="select(item)" ng-class="{sel: item == selected}">
            <span class="filters_ct_status"></span>
            {{filters.time}}
        </li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

Js:

  var filters = [
            {
                'filterId': 1,
                'time': 'last 24 hours',
            },
            {
                'filterId': 2,
                'time': 'all',
            },
            {
                'filterId': 3,
                'time': 'last hour',
            },
            {
                'filterId': 4,
                'time': 'today',
            },
            {
                'filterId': 5,
                'time': 'yersteday',
            }
        ]; 


function selectFilter($scope) {

    $scope.items = ['filters'];
    $scope.selected = $scope.items[0];

    $scope.select= function(item) {
       $scope.selected = item; 
    };

}
Run Code Online (Sandbox Code Playgroud)

拜托,给我一些帮助.

谢谢

dco*_*ith 68

最好的解决方案是通过角度来定位它,角度$index是阵列中的对象索引/位置;

HTML

<div ng-app='app' class="filters_ct" ng-controller="selectFilter">
    <ul>
        <li ng-repeat="filter in filters" ng-click="select($index)" ng-class="{sel: $index == selected}">
            <span class="filters_ct_status"></span>
            {{filter.time}}
        </li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

JS /控制器

var app = angular.module('app', []); 

app.controller('selectFilter', function($scope) {
var filters = [
            {
                'filterId': 1,
                'time': 'last 24 hours',
            },
            {
                'filterId': 2,
                'time': 'all',
            },
            {
                'filterId': 3,
                'time': 'last hour',
            },
            {
                'filterId': 4,
                'time': 'today',
            },
            {
                'filterId': 5,
                'time': 'yersteday',
            }
        ]; 

    $scope.filters = filters;
    $scope.selected = 0;

    $scope.select= function(index) {
       $scope.selected = index; 
    };
});
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

  • Uep,所以如果`ng-class`指令的表达式的结果为'true`,那么它在LI上设置类`sel`,如果不是,则不设置它. (2认同)

Rob*_*ick 9

慢慢回答,这是我得到的(可能会增加一点)

工作演示: http ://jsfiddle.net/WVY7L/

模板

<ul>
    <li ng-repeat="filter in filters" 
       ng-click="select($index)" ng-class="{active: $index===selectedIndex}">
        <span class="filters_ct_status"></span>
        {{filter.time}}
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

CONTROLLER

$scope.filters = [
        { filterId: 1, time: 'last 24 hours'},
        { filterId: 2, time: 'all' },
        { filterId: 3, time: 'last hour'},
        { filterId: 4, time: 'today' },
        { filterId: 5, time: 'yersteday'}
    ]; 
$scope.selectedIndex = 0; /* first one set active by default */
$scope.select= function(i) {
  $scope.selectedIndex=i;
};
Run Code Online (Sandbox Code Playgroud)

其余的是确保您的控制器传递了阵列号

ng-click="select($index)" ng-class="{active: $index===selectedIndex}"
Run Code Online (Sandbox Code Playgroud)

并能够保存该阵列号selectedIndex以便在您的模板中使用

$scope.selectedIndex
Run Code Online (Sandbox Code Playgroud)

ng-class语法

    {active: $index===selectedIndex}
Run Code Online (Sandbox Code Playgroud)

当'$ index'等于'selectedIndex'时,转换为添加名为'active'的类