我正在尝试使用knockout和underscore.js构建表。 当我需要在另一个循环中放置一个循环时,我遇到了情况,例如:
<tbody >
<% _.each(ShippingCharge.Lines(), function(line) { %>
<tr>
<td><input type="text" class="form-control" data-bind="value : line.ShippingZone.Name"/></td>
<% _.each(line.Charges(), function(data) { %>
<td><input type="text" class="form-control" data-bind="value : data"/></td>
<% }) %>
</tr>
<% }) %>
</tbody>
问题是当line.Charges()
值被修改时,observableArray
不会更新。您可以在jsFiddle上查看。请注意,只有嵌套循环不会更新observaleArray
,您可以更改Zones
列值并查看它们是否更改observaleArray
答案 0 :(得分:1)
这是你正在努力的映射插件。映射插件可以做到魔术,但有时候ViewModel不正确或者要复杂以供映射插件处理。
首先这句话很重要: http://knockoutjs.com/documentation/observableArrays.html
关键点:observableArray跟踪数组中的对象,而不是那些对象的状态
如果查看映射操作的结果,属性
vm.ShippingCharge.Lines()[0].Charges
是一个可观察的数组。
您的要求是能够更改单个Charges(跟踪Charges数组中每个对象的状态)。所以它应该是一个可观察数组,或者当数组中的值的数量是动态的时,一个可观察的可观察数组。
我不确定映射插件是否可以执行此操作。
任何方式,我认为你的ViewModel是复杂的映射插件,所以留下它的神奇之处,并手动编写视图模型。
更新(工作)小提琴:http://jsfiddle.net/martijn/NW5Vn/145/