1

我需要检测何时在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 中,我看到了 beforeMove 和 afterMove 的新事件。但是,我找不到任何以编程方式使用它们的方法。

最终目标是能够立即镜像数据库中的客户端更改,但不显示添加/删除来代替移动事件。在列表中向上或向下移动的记录不应标记为已删除然后新添加。

可以在 JavaScript 中直接使用新的 beforeMove/afterMove 绑定(例如事件模型?)来改进这一点吗?

干杯,

4

1 回答 1

1

我使用的答案是基于这个问题这个 jsfiddle

和函数可以通过一个简单的订阅来访问beforeMoveafterMove

var obs = ko.observableArray();
obs.subscribe(function( arrayOfValues ) {
   console.log('moving', arrayOfValues);
}, undefined, 'beforeMove');

obs.subscribe(function( arrayOfValues ) {
   console.log('moved', arrayOfValues);
}, undefined, 'afterMove');

然而,事实证明这并不是特别有用,因为它返回数组中更改索引的所有元素。例如,如果我从列表中删除一条记录,我会为删除后的每条记录获得一个移动事件。

所以我会坚持超时,直到我找到更好的东西。

于 2012-11-21T18:49:07.440 回答