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

rlc*_*ews 2 javascript knockout.js

之前后如何更新数组的顺序.我遵循迈克尔·贝斯特的建议,并使用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]);
    } 
Run Code Online (Sandbox Code Playgroud)

我遇到麻烦的地方是增加数组中的项目.从阅读Array Splice的用法第一个参数指示了向上移动的位置我认为会是这样i+1,值2表示阵列中有多少项会改变所以没有变化那么我想的范围就是当我增加位置时,所选项目数组[i]和结尾将是[i + 1].

self.itemList.splice(i+1, 2, array[i], array[i+1]);
Run Code Online (Sandbox Code Playgroud)

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

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

-干杯

Mat*_*ens 7

差不多了.这就是我做到的.

向上移动项目时,需要将其与前一项目交换.因此,你需要在指数更换元件i-1iarray[i]array[i-1],分别.你的moveup方法正是如此,所以一切都很好.

现在,在向下移动项目时,您需要将其与下一个项目交换.因此,更换元件的指标i,并i+1array[i+1]array[i]分别.但是您的代码更改的元素i+1i+2,这也是白搭.相反,你应该这样做:

self.itemList.splice(i, 2, array[i+1], array[i]);
Run Code Online (Sandbox Code Playgroud)

您在开始拼接i(如你在删除元素ii+1),并您替换它们(该索引处插入)array[i+1]array[i].

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