Angular Флажки "Выбрать все" с только одним выбранным полем
У меня есть форма, содержащая 3 флажка: " Выбрать все", " Вариант 1" и " Вариант 2".
<form id="selectionForm">
<input type="checkbox" ng-model="selectAll" >Select all
<br>
<input type="checkbox" ng-checked="selectAll" checked>Option 1
<br>
<input type="checkbox" ng-checked="selectAll">Option 2
</form>
На начальной загрузке страницы я хочу проверить только вариант 1. И затем, если флажок Выбрать все установлен, он должен автоматически проверять Вариант 1 и Вариант 2, чтобы все были выбраны.
Проблема заключается в загрузке начальной страницы, которую оценивает ng-checked = "selectAll", которая переопределяет мою попытку первоначально проверить только вариант 1 (selectAll = false изначально), поэтому ничего не выбрано.
Это кажется простой проблемой для решения, но я не могу понять решение... Заранее благодарим за любые идеи или советы!
Ответы
Ответ 1
Еще один способ сделать это - использовать модель для параметров, задать выбор по умолчанию в модели и настроить контроллер на логику выбора.
angular.module("app", []).controller("ctrl", function($scope){
$scope.options = [
{value:'Option1', selected:true},
{value:'Option2', selected:false}
];
$scope.toggleAll = function() {
var toggleStatus = !$scope.isAllSelected;
angular.forEach($scope.options, function(itm){ itm.selected = toggleStatus; });
}
$scope.optionToggled = function(){
$scope.isAllSelected = $scope.options.every(function(itm){ return itm.selected; })
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"> </script>
<div ng-app="app" ng-controller="ctrl">
<form id="selectionForm">
<input type="checkbox" ng-click="toggleAll()" ng-model="isAllSelected">Select all
<br>
<div ng-repeat = "option in options">
<input type="checkbox" ng-model="option.selected" ng-change="optionToggled()">{{option.value}}
</div>
</form>
{{options}}
</div>
Ответ 2
Попробуйте следующее:
<form id="selectionForm">
<input type="checkbox" ng-model="selectAll" >Select all
<br>
<input type="checkbox" ng-checked="selectAll || option1" ng-init="option1=true" ng-model="option1">Option 1
<br>
<input type="checkbox" ng-checked="selectAll">Option 2
</form>
Ответ 3
Мне нравится использовать ng-repeat для ясности при отображении того, что вы выбираете/не выбираете, в основном у вас заканчивается приятный маленький объект, чтобы основывать все это, и добавление к нему просто проще.
Здесь Plunker
* Также обратите внимание, как вы можете достичь allSelected? с петлей func и не тонны html, и я уверен, что это можно сделать с меньшим количеством спагетти, но оно работает *
app.controller('MainCtrl', function($scope) {
$scope.allSelected = false;
$scope.checkboxes = [{label: 'Option 1',checked: true}, {label: 'Option 2'}}}];
$scope.cbChecked = function(){
$scope.allSelected = true;
angular.forEach($scope.checkboxes, function(v, k) {
if(!v.checked){
$scope.allSelected = false;
}
});
}
$scope.toggleAll = function() {
var bool = true;
if ($scope.allSelected) {
bool = false;
}
angular.forEach($scope.checkboxes, function(v, k) {
v.checked = !bool;
$scope.allSelected = !bool;
});
}
});