knockout.js - 如何交换 observableArray 中的两个项目?

标签 knockout.js

我有一个按钮,可以将一个项目在 observableArray 中向左移动一个位置。我正在按照以下方式进行操作。然而,缺点是 categories()[index] 被从数组中删除,因此丢弃了该节点上的任何 DOM 操作(在我的情况下通过 jQuery 验证)。

有没有办法在不使用临时变量的情况下交换两个项目以保留 DOM 节点?

    moveUp: function (category) {
        var categories = viewModel.categories;
        var length = categories().length;
        var index = categories.indexOf(category);
        var insertIndex = (index + length - 1) % length;

        categories.splice(index, 1);
        categories.splice(insertIndex, 0, category);
        $categories.trigger("create");
    }

最佳答案

这是我的 moveUp 版本一步完成交换:

moveUp: function(category) {
    var i = categories.indexOf(category);
    if (i >= 1) {
        var array = categories();
        categories.splice(i-1, 2, array[i], array[i-1]);
    }
}

但是,这仍然不能解决问题,因为 Knockout 仍会将交换视为删除和添加操作。有一个open issue不过,为了让 Knockout 支持移动项目。更新:从 2.2.0 版开始,Knockout 可以识别移动的项目和 foreach绑定(bind)不会重新渲染它们。

关于knockout.js - 如何交换 observableArray 中的两个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10258086/

相关文章:

javascript - 可观察数组中的 knockout 搜索

knockout.js - 强制更新受限制的计算属性

javascript - 当我在 knockout 中从服务器加载数据时 undefined object

javascript - 如何正确引用传递给 knockout.JS 的当前元素的属性?

javascript - Knockout 无法处理 'foreach' 的绑定(bind)

javascript - 如何根据下拉结果让 knockout 网格显示标题和数据

internet-explorer-7 - knockoutjs attr 绑定(bind)和 IE7

twitter-bootstrap - Bootstrap Accordion 不适用于 Knockout 生成的项目

javascript - 在 KnockoutJS 中,是否有必须声明计算值的特定顺序?

javascript - 如何隐藏验证消息