Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js KnockoutJS如何知道某个项目何时为';移动';在阵列中?_Knockout.js - Fatal编程技术网

Knockout.js KnockoutJS如何知道某个项目何时为';移动';在阵列中?

Knockout.js KnockoutJS如何知道某个项目何时为';移动';在阵列中?,knockout.js,Knockout.js,在这本书中,据说人们可以: 使用任何afterRender/afterAdd/beforeRemove/beforeMove/afterMove回调函数 当我这样做时: var myArray = ko.observableArray([complexObj, complexObj, complexObj]); // move the second item to the first position myArray.splice(0, 0, myArray().splice(1, 1)[0])

在这本书中,据说人们可以:

使用任何afterRender/afterAdd/beforeRemove/beforeMove/afterMove回调函数

当我这样做时:

var myArray = ko.observableArray([complexObj, complexObj, complexObj]);
// move the second item to the first position
myArray.splice(0, 0, myArray().splice(1, 1)[0]);
我先删除一个项目,然后再添加回来,换句话说,我移动它。敲除如何区分何时触发哪个回调(还是全部触发3个回调)?
敲除如何区分已移动的数组项和新添加但值完全相同的数组项?

根据,索引更改的每个记录都将触发
*move
回调。这意味着当您删除一个时,它之后的所有用户都将被触发回调。然后当你插入时,他们会再次开火。两个
拼接
s是可观察阵列上的独立操作;它无法注意到您正在一起使用它们。

如果您在数组上执行两个操作,Knockout会将它们视为单独的,并将在删除之前调用
,在添加之后调用
。要启动移动回调,击倒需要同时看到这两个更改。实现这一点的一种方法是在可观测阵列上使用
rateLimit
扩展器:

var myArray = ko.observableArray([obj1, obj2, obj3]).extend({rateLimit: 0});

// move the second item to the first position
myArray.splice(0, 0, myArray.splice(1, 1)[0]);
在您的问题中,内部的
splice
直接针对底层数组而不是可观察数组执行,因为它使用
myArray().splice()
。所以敲除实际上只看到由外部拼接执行的操作,到那时两者都已完成


Knockout知道项目被移动,因为它使用算法版本将数组的当前内容与其以前的内容进行比较。

谢谢,这很好地回答了我的问题。我认为应该在文档中的某个地方说明这一点,以便我们知道何时/为什么要更新底层数组,而不是使用Knockout的数组方法。