validate ngvalue change asignar angularjs checkbox angularjs-ng-repeat

ngvalue - Marque/Desmarque todas las casillas de verificación-AngularJS ng-repeat



ng model angularjs (5)

Tengo una estructura que se ve así: http://jsfiddle.net/deeptechtons/TKVH6/

<div> <ul ng-controller="checkboxController"> <li>Check All <input type="checkbox" ng-model="selectedAll" ng-click="checkAll()" /> </li> <li ng-repeat="item in Items"> <label>{{item.Name}} <input type="checkbox" ng-model="item.Selected" /> </label> </li> </ul> </div> angular.module("CheckAllModule", []) .controller("checkboxController", function checkboxController($scope) { $scope.Items = [{ Name: "Item one" }, { Name: "Item two" }, { Name: "Item three" }]; $scope.checkAll = function () { if ($scope.selectedAll) { $scope.selectedAll = true; } else { $scope.selectedAll = false; } angular.forEach($scope.Items, function (item) { item.Selected = $scope.selectedAll; }); }; });

Cuando se selecciona o anula la selección de verificación, se seleccionan todas las demás casillas de verificación. Pero cuando se selecciona "Verificar todo" y anulo la selección de uno de los elementos, quiero que se anule la selección de "Marcar todo".

¡Gracias por adelantado!

(PD: gracias a deeptechtons para JSFiddle)


Aquí hay una pequeña forma de hacer esto

http://jsfiddle.net/TKVH6/850/

Use un poco de indeferencia (solo la reducción) y ng-checked

<input type="checkbox" ng-model="selectedAll" ng-click="checkAll()" ng-checked="allSelected()"/> $scope.allSelected = function () { var allSelect = _.reduce($scope.Items, function (memo, todo) { return memo + (todo.Selected ? 1 : 0); }, 0); return (allSelect === $scope.Items.length); };

Puede usar javascripts incorporados en .reduce si no quiere usar guiones bajos.


Puede usar esta función para verificar si todos los registros están marcados cada vez que una casilla de verificación cambia:

$scope.checkStatus= function() { var checkCount = 0; angular.forEach($scope.Items, function(item) { if(item.Selected) checkCount++; }); $scope.selectedAll = ( checkCount === $scope.Items.length); };

El código de vista:

<input type="checkbox" ng-model="item.Selected" ng-change="checkStatus();"/>

http://jsfiddle.net/TKVH6/840/


Si está usando Angular 1.3+ puede usar getterSetter de ng-model-options para resolver esto y evitar hacer un seguimiento manual del estado allSelected

HTML:

<input type="checkbox" ng-model="allSelected" ng-model-options="{getterSetter: true}"/>

JS:

var getAllSelected = function () { var selectedItems = $scope.Items.filter(function (item) { return item.Selected; }); return selectedItems.length === $scope.Items.length; } var setAllSelected = function (value) { angular.forEach($scope.Items, function (item) { item.Selected = value; }); } $scope.allSelected = function (value) { if (value !== undefined) { return setAllSelected(value); } else { return getAllSelected(); } }

http://jsfiddle.net/2jm6x4co/


ejemplo de trabajo: http://jsfiddle.net/egrendon/TKVH6/845/

ver:

<input type="checkbox" ng-model="item.Selected" ng-click="setCheckAll(item)" />

controlador:

angular.module("CheckAllModule", []) .controller("checkboxController", function checkboxController($scope) { $scope.Items = [{ Name: "Item one" }, { Name: "Item two" }, { Name: "Item three" }]; $scope.checkAll = function () { if ($scope.selectedAll) { $scope.selectedAll = true; } else { $scope.selectedAll = false; } angular.forEach($scope.Items, function (item) { item.Selected = $scope.selectedAll; }); }; $scope.setCheckAll = function (item) { // // Check if checkAll should be unchecked // if ($scope.selectedAll && !item.Selected) { $scope.selectedAll = false; } // // Check if all are checked. // var checkCount = 0; angular.forEach($scope.Items, function(item) { if(item.Selected) checkCount++; }); $scope.selectedAll = ( checkCount === $scope.Items.length); }; });


Esta respuesta tiene una lógica similar a la respuesta de Kmart2k1 . Pone la responsabilidad de actualizar la casilla maestra en cada niño en ng-repeat . En lugar de usar array.forEach , uso array.some para verificar más rápidamente si alguno de los elementos no está seleccionado.

HTML:

<li ng-repeat="item in Items"> <label>{{item.Name}} <input type="checkbox" ng-model="item.Selected" ng-change="notifyMaster()"/> </label> </li>

Javascript

$scope.notifyMaster = function () { $scope.selectedAll = !$scope.Items.some(function (item) { return !item.Selected; //check if ANY are unchecked }); }

Violín bifurcado