项目从Knockout可观察数组中删除,但不从html表中删除

时间:2014-01-02 22:58:59

标签: knockout.js footable

我有一个说明我问题的插件:http://plnkr.co/edit/PzBrcTX0Vnn01xWy4dk6

这是一个包含“设置”列表的表。它使用Footable,因此可以对列表进行排序以及Footable的其他功能。

场景1:运行,按下一行或多行的删除设置按钮。请注意,按下按钮后将删除该行。这是预期的行为。

场景2:运行,单击设置列标题并确保列已排序,按下删除按钮。请注意,该行不会从视图中删除。

如果你在ApplicationSettings.js中设置了一个断点:

var removeItem = function (item) {
    items.remove(item);
};

您可以看到,在两种情况下,可观察数组都会按预期删除项目,但在方案2中,视图未按预期更新。

1 个答案:

答案 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