Я немного поискал и обнаружил, что отменить выбор переключателей не так просто. Ниже приведен вопрос, который несколько касался его, но, похоже, он не работает, когда выполняется в блоке ng-repeat: AngularJs. Можно ли отменить выбор HTML-ввода «радио» щелчком мыши?
Вот как я решил проблему. Сначала я настраиваю ng-repeat как таковой:
<div ng-repeat="role in roles" class="checkbox checkbox-inline checkbox-primary">
<input id="{{ role.Value }}" ng-model="$parent.roleSelected" class="styled" type="radio"
name="{{ role.Group }}" value="{{ role.Value }}" ng-click="clickRole($event)" />
<label for="{{ role.Value }}">{{ role.Name }}</label>
</div>
В контроллере у меня есть два метода. Один для ng-click и один, который отслеживает изменения в ng-модели. У меня также есть массив ($scope.rolesSelected), который отслеживает выбранные роли. (У меня было несколько блоков ng-repeat на странице, некоторые из них были радио, некоторые были флажками).
При нажатии радио (или флажка) выполняется функция clickRole(), которая добавляет roleSelected в массив rolesSelected.
$scope.clickRole = function (event) {
if (event.target.type != 'radio') { // for checkboxes
addOrRemoveFromArray($scope.rolesSelected, event.target.value);
} else { // for radio - uncheck radio if selection was removed
var addedRole = addOrRemoveFromArray($scope.rolesSelected, event.target.value);
if (!addedRole) {
event.target.checked = false;
}
}
}
Функция addOrRemoveFromArray() просто добавляет заданное значение, если его еще нет в массиве, иначе удаляет его. Это позволяет удалить выбранную роль при двойном нажатии переключателя (один раз для добавления, второй для удаления).
function addOrRemoveFromArray(array, value) {
if (typeof value == 'undefined') { return; }
var index = array.indexOf(value);
if (index > -1) {
array.splice(index, 1);
return false;
} else {
array.push(value);
return true;
}
}
До сих пор он обрабатывает добавление роли и удаление роли при отмене выбора. (также обрабатывает добавление/удаление флажков). Но для радио при выборе другой роли предыдущая не удаляется. Поэтому для ng-модели требовалась еще одна функция watch().
$scope.$watch('roleSelected', function (newValue, oldValue) {
removeFromArray($scope.rolesSelected, oldValue);
});
Наконец, с этим я смог справиться со сменой ролей на переключателях, а также с отменой выбора.
Мне потребовалось много времени, чтобы понять, поэтому я публикую здесь, если кто-то еще столкнется с подобной ситуацией. Спасибо!
person
John Lee
schedule
13.02.2016