我需要检测项目在observableArray中移动的时间。在我当前的版本(2.1.0)中,我通过在所有删除事件上调用setTimeout
并等待以后立即查看添加事件来实现此目的:
var delayed = [];
var key; /* obtained by comparing original observableArray with updated list and iterating all differences */
if( /** record exists in original list but not new list ) {
// it was deleted, we don't immediately fire a notification (it may get re-inserted in a moment)
delayed[key] = setTimeout(function() { sendDeleteNotification(key); }, 0);
}
else if( /** record exists in new list but not original */ ) {
if( delayed[key] ) {
// it was deleted and immediately re-added (it's a move)
clearTimeout(delayed[key]);
sendMoveNotification( key );
}
else {
// it was added
sendAddedNotification( key );
}
}
在淘汰赛2.2中,我看到new events for beforeMove and afterMove。但是,我找不到任何以编程方式使用它们的方法。
最终目标是能够立即镜像数据库中的客户端更改,但不会显示添加/删除代替移动事件。在列表中向上或向下移动的记录不应标记为已删除,然后重新添加。
可以直接在JavaScript中使用新的beforeMove / afterMove绑定(例如事件模型吗?)来改善这一点吗?
干杯,
答案 0 :(得分:1)
我使用的答案基于this so question和this jsfiddle。
可以通过简单订阅访问beforeMove
和afterMove
函数:
var obs = ko.observableArray();
obs.subscribe(function( arrayOfValues ) {
console.log('moving', arrayOfValues);
}, undefined, 'beforeMove');
obs.subscribe(function( arrayOfValues ) {
console.log('moved', arrayOfValues);
}, undefined, 'afterMove');
然而,事实证明这并不是特别有用,因为它返回数组中改变索引的所有元素。例如,如果我从列表中删除一条记录,我会在删除后的每条记录中获得一个移动的事件。
所以我会坚持超时,直到找到更好的东西。