最后我放弃了尝试为此使用 Panel ,而是使用了 Ext.List :
this.paragraphList = new Ext.List({
xtype: 'list',
store: this.paragraphStore,
itemTpl : '<div class="paragraph-content" >{text}</div><div class="paragraph-handle" ></div>',
cls: 'paragraph-list',
disableSelection: true,
height:'100%',
scroll: 'vertical'
});
这样我就不必担心渲染这个东西,我可以更新商店,渲染会自己发生。列表中的每个项目都有一个 Draggable 但没有 Droppable 对象。相反,在 'beforedragend' 事件中,我计算物品被丢弃的位置并相应地更新商店。一旦你弄清楚了 dragIndex 和 dropIndex 你可以做这样的事情:
//if item is moving down in the list dropIndex is decremented
//because the item is first removed and then added to new position
if (dropIndex > dragIndex) {
dropIndex--;
}
//in case the item isn't being dropped in an appropriate place
//just return and let Sencha reset the draggable object (snap back to place)
if (dropIndex == null || dropIndex == dragIndex) {
return;
}
//this will stop the item from resetting
//it is not in the Sencha documentation
draggable.cancelRevert = true;
this.resetAll();
var store = this.paragraphStore;
var paragraph = store.getAt(dragIndex);
store.suspendEvents(false);
store.remove(dragIndex);
store.resumeEvents();
store.insert(dropIndex, paragraph);
这里有一些额外的事情值得一提:
在 Draggable 对象上,您可以使用“eventTarget”来指定将启动拖动操作的 HTML 元素。这样您就可以添加一些图形,当您想要拖动它时,它就像每个元素的句柄一样。
您还可以使用“代理”属性来指定在拖动项目时显示的 html 元素。因为拖动实际上使用 css 翻译,如果您拖动列表的一个元素,例如在列表滚动时,它会变得相当复杂。代理可以是不属于列表的 div。
有关更多信息,请参阅 Sencha 文档并查看他们的源代码,因为有很多没有记录的内容:
http ://docs.sencha.com/touch/1-1/#!/api/Ext.util.Draggable