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

knockout underscore loop in loop loses observable functionality

我正在尝试构建 table 和 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

这就是您苦苦挣扎的地图插件。映射插件可以施展魔法,但有时 ViewModel 不正确或过于复杂,映射插件无法处理。

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

Key point: An observableArray tracks which objects are in the array, not the state of those objects

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

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

是一个可观察数组。

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

我不确定映射插件是否可以做到这一点。

无论如何,我认为您的 ViewModel 对于映射插件来说太复杂了,所以保留它的魔力,手动编写视图模型代码。

更新(工作)fiddle:http://jsfiddle.net/martijn/NW5Vn/145/