已经发布了很多关于在 Knockout 的 foreach 循环中使用复选框的问题,但我还没有看到为什么初始化检查绑定在某些情况下有效而不是其他情况的答案。
使用这个简单的视图模型:
viewModel = function (obj) {
this.AllPossibleThings = ko.observableArray(
[
{ ID: "1", Value: 'Thing1' },
{ ID: "2", Value: 'Thing2' },
{ ID: "3", Value: 'Thing3' },
{ ID: "4", Value: 'Thing4' }
]);
this.selectedThings = ko.observableArray(["2","3"]);
};
$(ko.applyBindings(new viewModel()));
将这些放在 foreach 模板中可以按您的预期工作。它显示了 4 个复选框,其中 2 和 3 已预先选中:
<table>
<tbody data-bind="template: { name: 'ThingTmpl', foreach: AllPossibleThings }">
</tbody>
</table>
<script id="ThingTmpl" type="text/html">
<tr>
<td><input type="checkbox"
data-bind="attr: {value: ID}, checked: $root.selectedThings" /></td>
<td><span data-bind="text: Value"></span></td>
</tr>
</script>
在没有模板的情况下做应该做的事情是不一样的:
<table>
<tbody data-bind="foreach: AllPossibleThings">
<tr>
<td><input type="checkbox"
data-bind="checked: $root.selectedThings,
attr: {value: ID}" /></td>
<td><span data-bind="text: Value"></span></td>
</tr>
</tbody>
</table>
非模板显示 4 个复选框,但没有预先选中。但是,当您单击第一个复选框时,然后选中 2 和 3。就像它在创建“selectedThings”数组之前被绑定并且从未观察到更改。
小提琴演示两者:http: //jsfiddle.net/jturnage/j763w/
任何人都知道为什么模板 foreach 在这里工作,但常规的 foreach 绑定却没有?