我正在尝试根据两个observablearrays获取复选框列表。第一个有一些programids,第二个有programid的所有记录。 observablearray的数据都来自数据库。
基本上我正在尝试获取已经为ProgramIDs数组中的用户分配的programid列表,并将其与AllPartnerPrograms数组的数组进行比较,并显示匹配的那些已检查。
然后我希望能够从新列表中检查并将其发送回服务器,以使用新的programid列表更新用户的数据。
我不确定为什么checkedValue绑定不起作用或者我不明白如何使其工作。我在这里用相同的代码创建了一个fiddle。
我假设$root.AllPartnerPrograms
将根据self.ProgramIDs
数组显示已检查的项目,但这不会发生。
如果我把这样的代码放入,它会被检查,但不会显示其他记录。
<input type="checkbox" data-bind="checkedValue: ProgramID, checked: ProgramID" />
如果我将foreach更改为<!-- ko foreach: AllPartnerPrograms -->
,那么我会获得其他记录但仍未根据第一个列表进行检查。
我在这里做错了什么?
我的代码
<div id="programs">
<!-- ko foreach: ProgramIDs -->
<input type="checkbox" data-bind="checkedValue: ProgramID, checked: $root.AllPartnerPrograms" />
<span data-bind="text: ProgramName"></span>
<!-- /ko -->
查看模型
var objPartnerPrograms;
vmPartnerProgramsModel = function () {
var self = this;
self.ProgramIDs = ko.observableArray(
[{ProgramID: 16002,ProgramName: "Program1"},
{ProgramID: 16003,ProgramName: "Program2"},
{ProgramID: 16005,ProgramName: "Program3"},
{ProgramID: 16006,ProgramName: "Program4"},
{ProgramID: 16011,ProgramName: "Program5"
}]);
self.AllPartnerPrograms = ko.observableArray(
[{ProgramID: 16002,ProgramName: "Program1"},
{ProgramID: 16003,ProgramName: "Program2"},
{ProgramID: 16005,ProgramName: "Program3"},
{ProgramID: 16006,ProgramName: "Program4"},
{ProgramID: 16011,ProgramName: "Program5"},
{ProgramID: 16102,ProgramName: "Program6"},
{ProgramID: 16104,ProgramName: "Program7"
}]);
};
$(document).ready(function () {
objPartnerPrograms = new vmPartnerProgramsModel()
ko.applyBindings(objPartnerPrograms, $("#programs")[0]);
});
答案 0 :(得分:2)
你没有在你的foreach循环中正确确定你的observable,它应该通过$ data访问。
说,我只保留一个包含所有选项的可观察列表。将此选项扩展为具有一个布尔值,使得选中的字段可以正常工作。当您将值保存回数据库时,您可以遍历数组并获取已检查的值。
var self = this;
var Program = function(id, name, isChecked) {
return {
id: ko.observable(id),
name: ko.observable(name),
isChecked: ko.observable(isChecked)
}
}
self.programArray = ko.observableArray([]);
// populate observable array checking the programs that match in both your lists
self.programArray.push(new Program(1234, 'name', true));
// in page
<!-- ko foreach: programArray -->
<input type="checkbox" data-bind="checked: $data.isChecked" />
<!-- /ko -->
HTH
答案 1 :(得分:1)
您的视图模型ProgramIDs
属性应该只包含所选项目的ID,而不是完整元素:
self.ProgramIDs = ko.observableArray([16002, 16003, 16005, 16006, 16011]);
您还需要绑定到foreach
绑定中的完整列表属性,并使用ProgramIds
进行检查绑定:
<div id="programs">
<!-- ko foreach: AllPartnerPrograms -->
<input type="checkbox" data-bind="checkedValue: ProgramID, checked: $root.ProgramIDs" />
<span data-bind="text: ProgramName"></span>
<!-- /ko -->
</div>
查看更新的jsFiddle。