您的代码有很多问题,最重要的是:
-
单选按钮按组工作,可由指定
name
属性
-
淘汰赛对Observatearray的效果并不完全相同(
selectedCustomers
在您的情况下)单选按钮和复选框上。
我更新了你的小提琴
https://jsfiddle.net/w75px6r2/7/
我真的不知道我能改变什么,不能改变什么。所以我将输入和输出数组保持不变。我只更改了这两种方法之间的数据处理。
基于此,您需要找出最佳解决方案。
在第一部分中,我只添加了另一个为查看而准备的数组,它只是扩展了原始项目
isSelected
可观察到。
那么我只是把它绑在视图中。现在您应该看到,复选框和单选按钮应该在同一视图中同时工作。
function Customer(type, name, checked) {
var self = this;
self.CustomerType = ko.observable(type);
self.Name = ko.observable(name);
self.IsChecked = ko.observable(checked || false);
}
function VM() {
var self = this;
//dynamically populated - this is for testing purpose
self.AllCustomers = ko.observableArray([{
code: "001",
name: 'Customer 1'
},
{
code: "002",
name: 'Customer 2'
},
{
code: "003",
name: 'Customer 3'
},
]);
self.AllCustomersViewModel = ko.observableArray(
self.AllCustomers().map(function(value) {
value.isSelected = ko.observable(false);
return value;
}));
self.selectedCustomers = ko.pureComputed(function() {
var result = [];
ko.utils.arrayForEach(self.AllCustomersViewModel(), function(item) {
if (item.isSelected()) {
result.push(item);
}
});
return result;
});
self.Customer = ko.observableArray([]); //I need to POST this back- all selected customers
//return all customers that checked the box
self.selectedCustomers.subscribe(function() {
self.Customer.removeAll();
ko.utils.arrayForEach(self.selectedCustomers(), function(item) {
self.Customer.push(new Customer(item.code, item.name, true));
});
});
}
ko.applyBindings(new VM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<!-- ko foreach: AllCustomersViewModel -->
<input type="checkbox" data-bind="checked: isSelected" />
<span data-bind="text: name"></span>
<!-- /ko -->
<h4>Selected customers</h4>
<div data-bind="foreach: Customer">
<span data-bind="text: CustomerType"></span>
<span data-bind="text: IsChecked"></span>
<span>,</span>
</div>
<br>
<!-- I need to convert them into radio options
eg:
Customer 1
[] Yes
[] No
-->
<strong>
Not working yet..only one of the Yes/No can be selected among all customers
</strong><br><br>
<!-- ko foreach: AllCustomersViewModel -->
<span data-bind="text: name"></span><br>
<input type="radio" data-bind="value: true, checked: isSelected, attr: {name: $index}" />Yes
<input type="radio" data-bind="value: false, checked: isSelected, attr: {name: $index}" />No
<br>
<!-- /ko -->