splice()不更新knockout.js中数组的项目顺序

时间:2013-06-17 15:33:15

标签: javascript knockout.js

关于如何更新数组顺序的prior post之后。我遵循Michael Best的建议,并使用splice()修改按钮单击

上的数组顺序
self.moveup = function (itemIndex) {
    var i = self.itemList.indexOf(itemIndex); 
    if(i >= 1){
     var array = self.itemList();
        self.itemList.splice(i-1, 2, array[i], array[i-1]);
    } 

我遇到麻烦的地方是增加数组中的项目。 From reading the usage of Array Splice第一个参数指示升级应该向上移动的位置我会认为是i+1,值2表示数组中有多少项会改变所以没有改变然后是范围我想到的是选定的项目数组[i],结尾将是[i + 1],因为我正在增加位置。

self.itemList.splice(i+1, 2, array[i], array[i+1]);

在附加的小提琴手中,您可以看到值增加但物品实际上没有改变顺序,只有当您按下向下按钮时它们才会复制。我希望结果与调用moveUp时的结果相同。

我很感激我在这里缺少的任何指示。 http://jsfiddle.net/rlcrews/SCWmk/5/

-cheers

1 个答案:

答案 0 :(得分:7)

几乎就在那里。 Here's how I did it.

向上移动项目时,需要将其与上一项目交换。因此,您需要分别用i-1i替换索引array[i]array[i-1]处的元素。你的moveup方法完全正确,所以一切都很好。

现在,在向下移动项目时,您需要将其与 next 项目交换。因此,您分别用ii+1替换索引array[i+1]array[i]处的元素。但是,您的代码会更改元素i+1i+2,这不是好事。相反,你应该这样做:

self.itemList.splice(i, 2, array[i+1], array[i]);

您开始在i进行拼接(当您删除ii+1处的元素时),然后用array[i+1]替换它们(在该索引处插入) array[i]

另一方面,您检查是否可以将项目向下移动是不正确的。您不应该向下移动的唯一项目是最后一项,即索引self.itemList().length-1处的元素。因此,检查应该看起来像if (i < array.length - 1) { ... }(见小提琴)。