我试图在复选框上强制进行单选,类似于html“select”
我有一个简单的html表:
<tr ng-repeat="subscription in entities">
<td>
<input type="checkbox" ng-checked="isChecked(subscription)" ng-click="toggleSelection(subscription)"/>
</td>
</tr>
然后我有一些简单的控制器函数用于上述指令:
$scope.isChecked = function(entity) {
return $scope.checkedEntity === entity;
};
$scope.toggleSelection = function(entity) {
entity.checked = !entity.checked;
if (entity.checked) {
$scope.checkedEntity = entity;
} else {
$scope.checkedEntity = null;
}
};
不幸的是它不起作用,我想我刚刚发现了为什么...... ng-click有0个优先级,而ng-checked有100个。
这个问题有优雅的解决方案吗?
答案 0 :(得分:23)
将ng-model
绑定到subscription.checked
,并ng-click
取消选中除点击之外的所有订阅。由于这些是复选框,单击的那个将自动切换。
<tr ng-repeat="subscription in entities">
<td>
<input ng-model="subscription.checked" ng-click="updateSelection($index, entities)" type="checkbox" />
</td>
</tr>
您可以使用简单的for
循环,但angular's forEach
允许我们将每个项目设为subscription
,并提高可读性:
$scope.updateSelection = function(position, entities) {
angular.forEach(entities, function(subscription, index) {
if (position != index)
subscription.checked = false;
});
}
这是一个有效的演示:http://plnkr.co/edit/XD7r6PoTWpI4cBjdIZtv?p=preview
答案 1 :(得分:8)
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<script>
angular.module('app', []).controller('appc', ['$scope',
function($scope) {
$scope.selected = 'other';
}
]);
</script>
</head>
<body ng-app="app" ng-controller="appc">
<label>SELECTED: {{selected}}</label>
<div>
<input type="checkbox" ng-checked="selected=='male'" ng-true-value="'male'" ng-model="selected">Male
<br>
<input type="checkbox" ng-checked="selected=='female'" ng-true-value="'female'" ng-model="selected">Female
<br>
<input type="checkbox" ng-checked="selected=='other'" ng-true-value="'other'" ng-model="selected">Other
</div>
</body>
</html>
&#13;
答案 2 :(得分:1)
我使用下面的代码来实现类似的功能。诀窍是使用 ng-click ,这可以很好地产生这种效果。 checkbox-1&amp; checkbox-2 本质上是布尔值。
<form>
<input type="checkbox" ng-click="checkbox-2 = false" ng-model="checkbox-1" >
<input type="checkbox" ng-click="checkbox-1 = false" ng-model="checkbox-2" >
</form>
答案 3 :(得分:0)
在我的头顶,我建议你选择三个选项中的一个。
我选择选项3 - 我总是喜欢利用原生输入元素。
<tr ng-repeat="subscription in entities">
<td><input type="radio"
ng-model="selection"
name="subscriptionRadio"
value="{{subscription}}"/>
</td>
</tr>