項目が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 で直接利用できますか (イベント モデルなど?)。
乾杯、