由于@ ghemton的safeClone
方法,我已经能够在Ember.js中使用jQuery UI Sortable:Ember.js + jQuery UI Draggable Clone
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?
更新了解决方案:
(感谢Christopher Swasey在下面的回答)
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);
}
});
答案 0 :(得分:4)
你不应该在像Array这样的对象上使用JS标准库调用。这些调用不是Ember的绑定/观察者可以捕获的。相反,请使用Ember定义的API,例如'替换' objectAt'等来与数组进行交互。
在这种情况下,您希望将#splice替换为#replace。