@ghemtonのsafeClone
メソッドEmber.js+jQuery UI Draggable Cloneのおかげで、Ember.jsでjQueryUISortableを機能させることができました。
並べ替えが完了すると、Emberに変更を通知するのに問題があります。現在、コレクション内のアイテムを適切な場所に移動するために、ある配列位置から別の配列位置に配列要素を移動するsplice
で提案されているように使用しています。それは問題なく動作しますが、ウィンドウのスクロールに問題があります。
このjsfiddle、http: //jsfiddle.net/chrisconley/g4aE6/では、一番下までスクロールしてから要素のいずれかを並べ替えると、ウィンドウが一番上に戻ります。との間にブレークポイントを設定するpropertyWillChange
とpropertyDidChange
、Emberがビューからすべてのアイテムを一時的に削除していることがわかります。これにより、ウィンドウが一番上に戻ります。
App.MySortableView = Em.CollectionView.extend({
moveItem: function(fromIndex, toIndex){
var items = this.get('content');
this.propertyWillChange('content');
item = items.splice(fromIndex, 1)[0];
items.splice(toIndex, 0, item);
this.propertyDidChange('content');
}
});
コレクション全体を削除して置き換えることなく、変更をEmberに通知する方法はありますか?
更新されたソリューション:
(以下のクリストファー・スワジーの回答に感謝します)
App.MySortableView = Em.CollectionView.extend({
moveItem: function(fromIndex, toIndex){
var items = this.get('content');
item = items.objectAt(fromIndex);
items.removeAt(fromIndex);
items.insertAt(toIndex, item);
}
});
ここでの完全な例:http://jsfiddle.net/chrisconley/NN35P/