循环中的敲除下划线循环失去了可观察的功能

时间:2015-01-18 16:18:31

标签: javascript jquery knockout.js

我正在尝试使用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

1 个答案:

答案 0 :(得分:1)

这是你正在努力的映射插件。映射插件可以做到魔术,但有时候ViewModel不正确或者要复杂以供映射插件处理。

首先这句话很重要: http://knockoutjs.com/documentation/observableArrays.html

  

关键点:observableArray跟踪数组中的对象,而不是那些对象的状态

如果查看映射操作的结果,属性

vm.ShippingCharge.Lines()[0].Charges

是一个可观察的数组。

您的要求是能够更改单个Charges(跟踪Charges数组中每个对象的状态)。所以它应该是一个可观察数组,或者当数组中的值的数量是动态的时,一个可观察的可观察数组。

我不确定映射插件是否可以执行此操作。

任何方式,我认为你的ViewModel是复杂的映射插件,所以留下它的神奇之处,并手动编写视图模型。

更新(工作)小提琴:http://jsfiddle.net/martijn/NW5Vn/145/