AngularJs - Best-Practices on adding an active class on click (ng-repeat)

后端 未结 4 2113
一个人的身影
一个人的身影 2020-12-02 12:32

I want to add an active class on click in a list, i tried the following code, but it adds the active class on all my items :/ :

HTML :



        
相关标签:
4条回答
  • 2020-12-02 12:50

    I'm well late to the party, but this is the most reusable pattern, and it will save you re-writing the same function every time.

    HTML:

    <ul>
      <li ng-repeat="item in list" ng-click="setActive(item, list)" ng-class="{active: item.active}"></li>
    </ul>
    

    JS:

    $scope.list = [{}, {}];
    
    $scope.setActive = function(item, list){
      list.some(function(item){
        if(item.active){
          return item.active = false;
        }
      });
      item.active = true;
    };
    
    0 讨论(0)
  • 2020-12-02 12:52

    The best solution would be to target it via angulars $index which is the objects index/position in the array;

    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>
    

    JS/Controller

    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; 
        };
    });
    

    JSFIDDLE

    0 讨论(0)
  • 2020-12-02 13:08

    Test on the ID of the selected item :

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

    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.filters = filters;
            $scope.selected = $scope.items[0];
    
            $scope.select= function(item) {
               $scope.selected = item; 
            };
    
        }
    
    0 讨论(0)
  • 2020-12-02 13:11

    Slow to answer, here is what I got ( might add a little more )

    WORKING DEMO : http://jsfiddle.net/WVY7L/

    TEMPLATE

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

    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;
    };
    
    • worth a mention that in the data you have trailing comma that should not be there.

       { filterId: 1, time: 'last 24 hours'**,**}
      

    The rest was ensuring your controller was being passed the array number

    ng-click="select($index)" ng-class="{active: $index===selectedIndex}"
    

    and being able to save that array number selectedIndex for use in your template

    $scope.selectedIndex
    

    ng-class syntax

        {active: $index===selectedIndex}
    

    Translates to add class with name of 'active' when the '$index' is equal to the 'selectedIndex'

    0 讨论(0)
提交回复
热议问题