利用beforeMove / afterMove没有绑定?

时间:2012-11-15 04:49:07

标签: knockout.js knockout-2.0

我需要检测项目在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绑定(例如事件模型吗?)来改善这一点吗?

干杯,

1 个答案:

答案 0 :(得分:1)

我使用的答案基于this so questionthis 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');

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

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