【问题标题】:splice() not updating items order of array within knockout.jssplice() 不更新 knockout.js 中数组的项目顺序
【发布时间】:2014-02-10 20:15:27
【问题描述】:

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/

-干杯

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    差不多了。 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) { ... }(见小提琴)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2011-07-08
      • 2017-12-15
      • 2023-02-13
      • 2018-04-13
      • 1970-01-01
      • 2018-12-17
      相关资源
      最近更新 更多