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 の新しいイベントが表示されます。ただし、プログラムでそれらを利用する手段が見つかりません。

最終的な目標は、クライアントの変更をデータベースにすぐにミラーリングできるようにすることですが、移動イベントの代わりに追加/削除を表示しないようにすることです。リスト内で上下に移動されたレコードは、削除済みとしてマークされてから新しく追加されるべきではありません。

これを改善するために、新しい beforeMove/afterMove バインディングを JavaScript で直接利用できますか (イベント モデルなど?)。

乾杯、

4

1 に答える 1

1

私が利用した答えは、この質問この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');

ただし、インデックスを変更する配列内のすべての要素を返すため、これは特に有用ではないことがわかりました。たとえば、リストからレコードを削除すると、削除されたレコードの後に​​すべてのレコードに対して移動イベントが発生します。

ですから、もっと良いものが見つかるまで、タイムアウトを維持します。

于 2012-11-21T18:49:07.440 に答える