我使用Knockout.js获得以下代码,以显示一系列bool作为一系列复选框:
<table>
<tr data-bind="foreach: Array">
<td><input type=checkbox data-bind="checked:$data"></td>
</tr>
<tr data-bind="foreach: Array">
<td data-bind="text:$data"></td>
</tr>
</table>
<button data-bind="click: toggle0">Toggle Element 0</button>
<script>
var simpleModel = {
"Array" : ko.observableArray([ko.observable(false),
ko.observable(false),
ko.observable(true)]),
"toggle0" : function() {
simpleModel.Array()[0](!simpleModel.Array()[0]());
}
};
ko.applyBindings(simpleModel);
</script>
如果查看http://jsfiddle.net/tP9Dm/3/,您会看到,虽然复选框会响应视图模型中的更改,但视图模型不会对复选框中的更改做出响应。
根据https://groups.google.com/d/msg/knockoutjs/-dHpOg5ZBPI/1q4iqdTlKvUJ,看起来$data
被foreach循环展开,因此data-bind
不知道如何使用它来更新模型。
显然,我可以通过使数组包含对象而不是简单的布尔来解决这个问题,但这似乎应该是一个不必要的额外的间接层。是否有更简单的方法将更改传播回模型?
答案 0 :(得分:1)
似乎没有办法做到这一点,因为在这种情况下$ data是未包装的值。
即使设置点击处理程序也不起作用,因为发送给处理程序的数据也会被解包。
无赖。看起来这样做的唯一方法就是将你的observable包装成一个对象,另一层是间接的。