How can I use the $index inside a ng-repeat to enable a class and show a DIV?

后端 未结 2 1273
感情败类
感情败类 2020-12-02 05:14

I have a set of

  • elements.

  • 相关标签:
    2条回答
    • 2020-12-02 05:44

      The issue here is that ng-repeat creates its own scope, so when you do selected=$index it creates a new a selected property in that scope rather than altering the existing one. To fix this you have two options:

      Change the selected property to a non-primitive (ie object or array, which makes javascript look up the prototype chain) then set a value on that:

      $scope.selected = {value: 0};
      
      <a ng-click="selected.value = $index">A{{$index}}</a>
      

      See plunker

      or

      Use the $parent variable to access the correct property. Though less recommended as it increases coupling between scopes

      <a ng-click="$parent.selected = $index">A{{$index}}</a>
      

      See plunker

      0 讨论(0)
    • 2020-12-02 05:47

      As johnnyynnoj mentioned ng-repeat creates a new scope. I would in fact use a function to set the value. See plunker

      JS:

      $scope.setSelected = function(selected) {
        $scope.selected = selected;
      }
      

      HTML:

      {{ selected }}
      
      <ul>
        <li ng-class="{current: selected == 100}">
           <a href ng:click="setSelected(100)">ABC</a>
        </li>
        <li ng-class="{current: selected == 101}">
           <a href ng:click="setSelected(101)">DEF</a>
        </li>
        <li ng-class="{current: selected == $index }" 
            ng-repeat="x in [4,5,6,7]">
           <a href ng:click="setSelected($index)">A{{$index}}</a>
        </li>
      </ul>
      
      <div  
        ng:show="selected == 100">
        100        
      </div>
      <div  
        ng:show="selected == 101">
        101        
      </div>
      <div ng-repeat="x in [4,5,6,7]" 
        ng:show="selected == $index">
        {{ $index }}        
      </div>
      
      0 讨论(0)
    提交回复
    热议问题