我将以下示例代码修改为复选框模型。链接在这里
http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.grid.plugin.DragDrop
首先有两个问题:
拖动项目时,所有选中的项目也会被移动。如何每次仅拖动一项?
另一个问题:
拖动项目时,将其变为选中状态。如何使它保持状态不变? (在拖动之前未选中时保持选中状态,反之亦然)
我正在使用4.2.1版。
这是从给定示例修改的代码:
Ext.onReady(function () {
Ext.create('Ext.data.Store', {
storeId: 'simpsonsStore',
fields: ['name'],
data: [
["Lisa"],
["Bart"],
["Homer"],
["Marge"]
],
proxy: {
type: 'memory',
reader: 'array'
}
});
Ext.create('Ext.grid.Panel', {
store: 'simpsonsStore',
selModel: {mode: 'SIMPLE'}, //added
selType: 'checkboxmodel', //added
columns: [{
header: 'Name',
dataIndex: 'name',
flex: true
}],
viewConfig: {
plugins: {
ptype: 'gridviewdragdrop',
dragText: 'Drag and drop to reorganize'
}
},
height: 200,
width: 400,
renderTo: Ext.getBody()
});
});
谢谢!
最佳答案
您需要覆盖DragDrop插件中的dragZone,因此它仅发送此记录。
拖动具有mousedown事件,该事件正在选择网格中的行(因为它也具有mousedown事件),因此在拖动结束之前将其触发。
为了理解这一点,我解释了此事件(有关更多信息w3schools:
行选择事件:这是网格行上的mousedown事件。
第drag
行事件:drag = mousepress +(可选)mousemove,但:mousepress并不真正存在,因此它借助mousedown和mouseup之间的时间来确定它
时间测量是通过delayTasks完成的
如果mouseup在延迟时间之前触发,则将不会执行,否则将开始拖动drop
行事件:drop =拖动+ mouseup
有更多方法可以防止这种情况:
尝试将选择内容放到另一个事件中,该事件在拖动开始后触发,但是由于此事件使用了很多次,所以可能会很杂乱...
它是在mousedown上选择它的,但是我们在拖动开始事件时取消了选择,而在拖放时我们阻止了选择,我在代码中做到了。
工作代码:
Ext.create('Ext.data.Store', {
storeId:'simpsonsStore',
fields:['name'],
data: [["Lisa"], ["Bart"], ["Homer"], ["Marge"]],
proxy: {
type: 'memory',
reader: 'array'
}
});
Ext.create('Ext.grid.Panel', {
store: 'simpsonsStore',
selModel: {mode: 'SIMPLE'}, //added
selType: 'checkboxmodel', //added
columns: [
{header: 'Name', dataIndex: 'name', flex: true}
],
viewConfig: {
plugins: {
ptype: 'gridviewdragdrop',
dragText: 'Drag and drop to reorganize',
onViewRender : function(view) {
var me = this,
scrollEl;
if (me.enableDrag) {
if (me.containerScroll) {
scrollEl = view.getEl();
}
me.dragZone = new Ext.view.DragZone({
view: view,
ddGroup: me.dragGroup || me.ddGroup,
dragText: me.dragText,
containerScroll: me.containerScroll,
scrollEl: scrollEl,
//to remember if the row was selected originally or not
onBeforeDrag: function(data, e) {
var me = this,
view = data.view,
selectionModel = view.getSelectionModel(),
record = view.getRecord(data.item);
if (!selectionModel.isSelected(record)) {
data.rowSelected = false;
}
return true;
},
onInitDrag: function(x, y) {
var me = this,
data = me.dragData,
view = data.view,
selectionModel = view.getSelectionModel(),
record = view.getRecord(data.item);
//for deselect the dragged record
if (selectionModel.isSelected(record) && data.rowSelected == false) {
selectionModel.deselect(record, true);
}
//added the original row so it will handle that in the drag drop
data.records = [record];
me.ddel.update(me.getDragText());
me.proxy.update(me.ddel.dom);
me.onStartDrag(x, y);
return true;
}
});
}
if (me.enableDrop) {
me.dropZone = new Ext.grid.ViewDropZone({
view: view,
ddGroup: me.dropGroup || me.ddGroup,
//changed the selection at the end of this method
handleNodeDrop : function(data, record, position) {
var view = this.view,
store = view.getStore(),
index, records, i, len;
if (data.copy) {
records = data.records;
data.records = [];
for (i = 0, len = records.length; i < len; i++) {
data.records.push(records[i].copy());
}
} else {
data.view.store.remove(data.records, data.view === view);
}
if (record && position) {
index = store.indexOf(record);
if (position !== 'before') {
index++;
}
store.insert(index, data.records);
}
else {
store.add(data.records);
}
if (view != data.view) {
view.getSelectionModel().select(data.records);
}
}
});
}
}
}
},
height: 200,
width: 400,
renderTo: Ext.getBody()
});
关于javascript - Extjs使用复选框模型在网格上拖放单个项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18478266/