我有一个说明我问题的插件:http://plnkr.co/edit/PzBrcTX0Vnn01xWy4dk6
这是一个包含“设置”列表的表。它使用Footable,因此可以对列表进行排序以及Footable的其他功能。
场景1:运行,按下一行或多行的删除设置按钮。请注意,按下按钮后将删除该行。这是预期的行为。
场景2:运行,单击设置列标题并确保列已排序,按下删除按钮。请注意,该行不会从视图中删除。
如果你在ApplicationSettings.js中设置了一个断点:
var removeItem = function (item) {
items.remove(item);
};
您可以看到,在两种情况下,可观察数组都会按预期删除项目,但在方案2中,视图未按预期更新。
答案 0 :(得分:3)
问题来自围绕每个<tr>
元素的空文本节点。 foreach
绑定还跟踪这些文本节点。请参阅https://github.com/knockout/knockout/pull/709,了解为什么不能忽略它们作为一般规则的原因。另一方面,您的自定义绑定可以将它们删除。
了解knockout-sortable如何做到这一点(出于类似原因):
var nodes = Array.prototype.slice.call(element.childNodes, 0);
ko.utils.arrayForEach(nodes, function(node) {
if (node && node.nodeType !== 1) {
node.parentNode.removeChild(node);
}
});
您需要确保在foreach
之前运行此操作。我修改了你的绑定:http://plnkr.co/edit/hS6Gb2xLfabSj9K8l03y?p=preview