我有一个带有以下模板的 ExtJS DataView:
<ul>
<tpl for=".">
<li class="report-field" id="{listId}">
{[this.getReorderLinks(values, xindex, xcount)]}
<span class="field-title small" data-qtip="{displayName}">{displayName}</span>
<i class="field-remove" title="' + deleteLabel + '"></i>
</li>
</tpl>
</ul>
这使得每个项目列表如下所示:
用户可以单击不同的图标并执行相关操作,按顺序向上/向下移动和删除。
请注意,这些项目是使用拖放添加到数据视图的,其中还有另一个源数据视图容器,我从中拖动项目并在此处添加。虽然这些向上/向下箭头可以很好地重新排序它们,但我想在内部使用拖放操作重新排序这些项目。
因此,为了使每个单独的项目在同一区域中可拖放,我使用refresh
了 dataview 事件并在那里注册了 DND,如下所示:
listeners: {
'refresh': function(dataview, eOpts) {
var fieldsList = Ext.query('.added-field');
// Iterate over the list and make each item draggable/droppable.
Ext.each(fieldsList,function(field){
var dragSource,
fieldId;
fieldId = field.id;
dragSource = new Ext.dd.DragSource(field, {
isTarget : false
});
dropZone = new Ext.dd.DropTarget(field);
dragSource.dragData = {
record: me.viewStore.findRecord('listId', fieldId),
fieldId: fieldId
};
dropZone.notifyDrop = function(source, event, params) {
var targetRecord = me.viewStore.findRecord('listId', fieldId),
targetRecordIdx = me.viewStore.indexOf(targetRecord),
sourceRecordIdx = me.viewStore.indexOf(params.record);
//Perform rearrangement in the store.
me.viewStore.removeAt(sourceRecordIdx);
me.viewStore.insert(targetRecordIdx, params.record);
return true;
};
});
}
但它给了我奇怪的行为;当我尝试将“Person Email”拖到“Person City”上时,DataView 被破坏,如下所示:
另外,我Uncaught TypeError: Cannot read property 'internalId' of undefined
在放置操作完成时得到。我什至尝试将调用推迟removeAt()
到insert()
某些毫秒,但仍然没有运气,此外,ExtJS 没有可用于拖放以重新排序 DataView 项目的文档或工作示例。
任何帮助将不胜感激,谢谢。