1

我有一个证明我的问题的 plunk:http: //plnkr.co/edit/PzBrcTX0Vnn01xWy4dk6

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

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

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

如果在 ApplicationSettings.js 中设置断点:

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

您可以看到,在这两种情况下,可观察数组都按预期删除了项目,但在场景 2 中,视图没有按预期更新。

4

1 回答 1

3

问题来自围绕每个<tr>元素的空文本节点。foreach绑定还跟踪那些文本节点。请参阅https://github.com/knockout/knockout/pull/709讨论为什么不能将它们作为一般规则忽略。另一方面,您的自定义绑定可以将它们剥离。

看看敲除排序如何做到这一点(出于类似的原因):

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

于 2014-01-02T23:37:11.203 回答