如何对$ data的更改传播回Knockout的视图模型?

时间:2011-12-24 08:32:57

标签: javascript knockout.js

我使用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不知道如何使用它来更新模型。

显然,我可以通过使数组包含对象而不是简单的布尔来解决这个问题,但这似乎应该是一个不必要的额外的间接层。是否有更简单的方法将更改传播回模型?

1 个答案:

答案 0 :(得分:1)

似乎没有办法做到这一点,因为在这种情况下$ data是未包装的值。

即使设置点击处理程序也不起作用,因为发送给处理程序的数据也会被解包。

无赖。看起来这样做的唯一方法就是将你的observable包装成一个对象,另一层是间接的。