2017-08-25 302 views
2

我正在使用AngularJs(Angular 1),我需要使用複選框來選擇/取消選中所有其他複選框。AngularJs複選框,將在所有其他複選框上選中

現在我有這樣的:

<li ng-repeat="item in ctrl.items"> 
    <input type="checkbox" ng-model="item.selected">{{item.name}} 
</li> 

然後,我有這個控制器:

ctrl.items = [ 
    { 
     value: 0, 
     name: 'Select All/Unselect all other checkboxes', 
     selected: true 
    }, 
    { 
     value: 1, 
     name: 'myCheckbox1', 
     selected: true 

    }, 
    { 
     value: 2, 
     name: 'myCheckbox2', 
     selected: true 

    }, 
    { 
     value: 3, 
     name: 'myCheckbox2', 
     selected: true 

    } 

]; 

我怎樣才能讓這個第一個複選框基本上只是選擇/取消選擇所有其他checkbboxes ?

回答

1

angular.module('app',[]).controller('MyController', function(){ 
 
    var ctrl = this; 
 
    
 
    ctrl.changed = function(item){    
 
     if(item.value == 0) 
 
     for(var x of ctrl.items) 
 
      x.selected = item.selected; 
 
    } 
 
    
 
    ctrl.items = [ 
 
     { 
 
      value: 0, 
 
      name: 'Select All/Unselect all other checkboxes', 
 
      selected: true 
 
     }, 
 
     { 
 
      value: 1, 
 
      name: 'myCheckbox1', 
 
      selected: true 
 
     }, 
 
     { 
 
      value: 2, 
 
      name: 'myCheckbox2', 
 
      selected: true 
 
     }, 
 
     { 
 
      value: 3, 
 
      name: 'myCheckbox2', 
 
      selected: true 
 
     } 
 
    ]; 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<div ng-app='app' ng-controller='MyController as ctrl'> 
 
    <li ng-repeat="item in ctrl.items"> 
 
    <input type="checkbox" ng-model="item.selected" ng-change='ctrl.changed(item)'>{{item.name}} 
 
    </li> 
 
</div>

0

你可以不喜歡這個 -

<li ng-repeat="item in ctrl.items"> 
    <input type="checkbox" ng-model="item.selected" ng-onchange="selectAll()">{{item.name}} 
</li> 

然後在控制器(可以用於切換添加條件) -

selectAll(){ 
    angular.forEach(items,(item)=>{ 
    item.selected=true; 
}); 
} 
+1

這將觸發任何選中的複選框上的操作,不僅僅是OP想要的第一個。 – rrd

0

簡單地看找你的模型的任何變化

$scope.$watch('item.selected', function() { 
       if ($scope.item.selected == 0){ 
        $scope.myCheckbox1.selected= false; 
        $scope.myCheckbox2.selected= false; 
        $scope.myCheckbox3.selected= false; 
       } else { 
        $scope.myCheckbox1.selected= true; 
        $scope.myCheckbox2.selected= true; 
        $scope.myCheckbox3.selected= true; 
       } 

    } 
+0

這個解決方案很糟糕。 – quirimmo

+0

如果你正在處理動態數據,那麼它的有效性是:| –

+0

由於這個原因,這是非常糟糕的,因爲在這種情況下絕對不需要任何觀察者 – quirimmo

0
<li ng-repeat="item in ctrl.items"> 
    <input type="checkbox" ng-model="item.selected" ng-change="all(item)">{{item.name}} 
</li> 

all(firstItem){ 
    if(firstItem.value == 0) 
     angular.forEach(ctrl, function(item, key){ 
      item.selected = firstItem.selected; 
     }) 
} 

希望這會有所幫助!

+0

代碼方法是完全正確的,但通過這種方式,您可以將所有函數調用到所有複選框。這不是用戶想要的。 – quirimmo

+0

請參閱最新的代碼 –

1

angular.module('app',[]).controller('MyController', function(){ 
 
    var ctrl = this; 
 
    
 
    ctrl.changed = function(item){    
 
     ctrl.items.forEach((el, index) => { 
 
    el.selected = ctrl.items[0].selected; 
 
}); 
 
} 
 
    
 
    ctrl.items = [ 
 
     { 
 
      value: 0, 
 
      name: 'Select All/Unselect all other checkboxes', 
 
      selected: true 
 
     }, 
 
     { 
 
      value: 1, 
 
      name: 'myCheckbox1', 
 
      selected: true 
 
     }, 
 
     { 
 
      value: 2, 
 
      name: 'myCheckbox2', 
 
      selected: true 
 
     }, 
 
     { 
 
      value: 3, 
 
      name: 'myCheckbox2', 
 
      selected: true 
 
     } 
 
    ]; 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<div ng-app='app' ng-controller='MyController as ctrl'> 
 
    <li ng-repeat="item in ctrl.items"> 
 
    <label ng-if="$index === 0" > 
 
    <input type="checkbox" ng-model="item.selected" ng-change="ctrl.changed(item)">{{item.name}} 
 
</label> 
 
    <label ng-if="$index > 0" > 
 
    <input type="checkbox" ng-model="item.selected">{{item.name}} 
 
</label> 
 
    </li> 
 
</div>

爲什麼分裂的元素?因爲你需要在第一個元素上調用ng-change代碼。如果你想綁定(可能你可能會這樣做)對其他元素進行另一個改變,你可以分開這些函數,並保持你的代碼更清晰和更清晰