我觉得我只是在这里遗漏了一些东西,但我看不清楚是什么。我似乎无法使单选按钮的值与复选框的行为方式相同。我做错了什么?
以下是演示:http://jsfiddle.net/vwJ6a/2/
这是我的HTML看起来像
的想法<tr ng-repeat="contact in ContactsList">
<td>{{contact.name}}</td>
<td>{{contact.email}}</td>
<td ng-class="{'success':contact.isPrimary}">
<input type="radio" name="radio-primary" ng-model="contact.isPrimary" />
</td>
<td ng-class="{'success':contact.isTechnical}">
<input type="checkbox" ng-model="contact.isTechnical" />
</td>
</tr>
这是我的控制器
function MyCtrl($scope) {
$scope.ContactsList = [{
name: "John Doe",
email: "joDoe@domain.com",
isPrimary: false,
isTechnical: true
}, {
name: "Jane Doe",
email: "jaDoe@domain.com",
isPrimary: true,
isTechnical: false
}, {
name: "Bill Murray",
email: "bMurray@domain.com",
isPrimary: false,
isTechnical: false
}, {
name: "Someone Dude",
email: "someone@domain.com",
isPrimary: false,
isTechnical: false
}];
}
答案 0 :(得分:5)
好问题!我遇到了类似的问题并实施了一些类似的工作。首先,我不认为您希望单选按钮的行为与复选框一样。复选框允许多个值,而无线电不允许。可能很清楚,我只是想说出来以防止误解。
AngularJS文档提供了有关单选按钮用法的一些说明。 https://docs.angularjs.org/api/ng/input/input[radio]这个解释并没有采取真正的动态&#34;帐户环境。如您所见,颜色在示例中以前缀为前缀。我假设你希望你的桌子完全是动态的,没有任何前缀。
我做的第一件事是HTML中的以下更改:
<form name="myForm" ng-controller="MyCtrl">
<h4>Primary: {{GetPrimaryContact().email}}</h4>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Primary</th>
<th>Technical</th>
<th>Sales</th>
<th>Billing</th>
<th>Emergency</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="contact in ContactsList">
<td>{{contact.name}}</td>
<td>{{contact.email}}</td>
<td ng-class="{'success':contact.isPrimary == 'true'}">
<input type="radio" name="radio-primary" ng-model="contact.isPrimary" value="true" ng-change="update($index)" />
</td>
<td ng-class="{'success':contact.isTechnical}">
<input type="checkbox" ng-model="contact.isTechnical" />
</td>
<td ng-class="{'success':contact.isSales}">
<input type="checkbox" ng-model="contact.isSales" />
</td>
<td ng-class="{'success':contact.isBilling}">
<input type="checkbox" ng-model="contact.isBilling" />
</td>
<td ng-class="{'success':contact.isEmergency}">
<input type="checkbox" ng-model="contact.isEmergency" />
</td>
</tr>
</tbody>
</table>
</form>
success
班级检查将isPrimary
与字符串&#39; true&#39;进行比较。在使用单选按钮进行比较时,我无法使用真实的布尔值。
此外,现在有一个value="true"
比较所需(它检查行,其中isPrimary实际上是true
)。最后一件事是ng-change
部分的新方法。我们需要这个,因为当一个值变为true时,我们需要告诉控制器其他值是false。这就是为什么我们还将$index
迭代的ng-repeat
提供给方法,因为当前更改为true
的值不需要false
试。
这是新的控制器:
function MyCtrl($scope) {
$scope.ContactsList = [{
name: "John Doe",
email: "joDoe@domain.com",
isPrimary: 'false',
isTechnical: true,
isSales: false,
isBilling: true,
isEmergency: true
}, {
name: "Jane Doe",
email: "jaDoe@domain.com",
isPrimary: 'true',
isTechnical: false,
isSales: false,
isBilling: true,
isEmergency: true
}, {
name: "Bill Murray",
email: "bMurray@domain.com",
isPrimary: 'false',
isTechnical: false,
isSales: true,
isBilling: false,
isEmergency: false
}, {
name: "Someone Dude",
email: "someone@domain.com",
isPrimary: 'false',
isTechnical: false,
isSales: false,
isBilling: false,
isEmergency: true
}];
$scope.GetPrimaryContact = function () {
return _.findWhere($scope.ContactsList, {
isPrimary: 'true'
});
};
$scope.update = function(index) {
for (var i=0;i<$scope.ContactsList.length;i++) {
if (index != i) {
$scope.ContactsList[i].isPrimary = 'false';
}
}
};
}
控制器包含更改,isPrimary
使用字符串而不是布尔值和新的update()
方法。以下是jsfiddle中工作演示的链接:http://jsfiddle.net/vwJ6a/20/
<强>更新强>
克里斯和我发现了一种方法,在ng-repeat中使用单选按钮的实际布尔值。
要使用它,必须使用ng-value="true"
代替value="true"
。 value
似乎不起作用,我在这里得到了这个想法:AngularJS - Binding radio buttons to models with boolean values
HTML部分将如下所示:
<form name="myForm" ng-controller="MyCtrl">
<h4>Primary: {{GetPrimaryContact().email}}</h4>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Primary</th>
<th>Technical</th>
<th>Sales</th>
<th>Billing</th>
<th>Emergency</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="contact in ContactsList">
<td>{{contact.name}}</td>
<td>{{contact.email}}</td>
<td ng-class="{'success':contact.isPrimary}">
<input type="radio" name="radio-primary" ng-value="true" ng-model="contact.isPrimary" ng-checked="contact.isPrimary" ng-change="UpdatePrimary(contact)" />
</td>
<td ng-class="{'success':contact.isTechnical}">
<input type="checkbox" ng-model="contact.isTechnical" />
</td>
<td ng-class="{'success':contact.isSales}">
<input type="checkbox" ng-model="contact.isSales" />
</td>
<td ng-class="{'success':contact.isBilling}">
<input type="checkbox" ng-model="contact.isBilling" />
</td>
<td ng-class="{'success':contact.isEmergency}">
<input type="checkbox" ng-model="contact.isEmergency" />
</td>
</tr>
</tbody>
</table>
</form>
和控制器是这样的:
function MyCtrl($scope) {
$scope.ContactsList = [{
name: "John Doe",
email: "joDoe@domain.com",
isPrimary: false,
isTechnical: true,
isSales: false,
isBilling: true,
isEmergency: true
}, {
name: "Jane Doe",
email: "jaDoe@domain.com",
isPrimary: true,
isTechnical: false,
isSales: false,
isBilling: true,
isEmergency: true
}, {
name: "Bill Murray",
email: "bMurray@domain.com",
isPrimary: false,
isTechnical: false,
isSales: true,
isBilling: false,
isEmergency: false
}, {
name: "Someone Dude",
email: "someone@domain.com",
isPrimary: false,
isTechnical: false,
isSales: false,
isBilling: false,
isEmergency: true
}];
$scope.GetPrimaryContact = function () {
return _.findWhere($scope.ContactsList, {
isPrimary: true
});
};
$scope.UpdatePrimary = function(contact) {
_.each($scope.ContactsList, function(x) {
x.isPrimary = (x.email === contact.email);
});
};
}
以下是jsfiddle中的演示:http://jsfiddle.net/vwJ6a/24/
答案 1 :(得分:5)
主要区别是复选框允许多个选项而单选按钮不。
这就是单选按钮应该共享相同模型的原因。在您的情况下,ngModel
指向不同的对象。
这就是我如何解决它:
<td ng-class="{'success':primaryContact.email == contact.email}">
<input type="radio" name="radio-primary" ng-model="primaryContact.email"
ng-value="contact.email"/>
</td>
$scope.primaryContact = {
email:"jaDoe@domain.com"
};
<强> Updated Fiddle 强>
答案 2 :(得分:0)
我相信如果您在收音机输入行添加value =“1”,您将获得您正在寻找的结果。
<input type="radio" value="1" name="radio-primary" ng-model="contact.isPrimary" />