我是Ext JS的新手,我尝试过'拖放',拖动行时效果很好。我现在正在尝试从左侧网格拖动一行(来自MySQL的字段)并将其放在右侧网格上,从而将数据库表中的数据作为列。
我现在使用的代码是,
Ext.require([
'Ext.grid.*',
'Ext.data.*',
'Ext.dd.*'
]);
Ext.define('DataObject', {
extend: 'Ext.data.Model',
fields: ['Field']
});
Ext.onReady(function(){
var firstGridStore = Ext.create('Ext.data.Store', {
model: 'DataObject',
autoLoad: true,
pageSize: 4,
proxy: {
type: 'ajax',
url : 'user.php',
reader: {
type: 'json',
root: 'users'
}
}
});
// Column Model shortcut array
var columns = [
{text: "Fields", sortable: true, width: 50, dataIndex: 'Field'}
];
var firstGrid = Ext.create('Ext.grid.Panel', {
multiSelect: true,
viewConfig: {
plugins: {
ptype: 'gridviewdragdrop',
dragGroup: 'firstGridDDGroup',
dropGroup: 'secondGridDDGroup'
},
listeners: {
drop: function(node, data, dropRec, dropPosition) {
var dropOn = dropRec ? ' ' + dropPosition + ' ' + dropRec.get('name') : ' on empty view';
Ext.example.msg("Drag from right to left", 'Dropped ' + data.records[0].get('name') + dropOn);
}
}
},
store : firstGridStore,
columns : columns,
stripeRows : true,
title : 'First Grid',
margins : '0 2 0 0'
});
var secondGridStore = Ext.create('Ext.data.Store', {
model: 'DataObject'
});
// create the destination Grid
var secondGrid = Ext.create('Ext.grid.Panel', {
viewConfig: {
plugins: {
ptype: 'gridviewdragdrop',
dragGroup: 'secondGridDDGroup',
dropGroup: 'firstGridDDGroup'
},
listeners: {
drop: function(node, data, dropRec, dropPosition) {
var dropOn = dropRec ? ' ' + dropPosition + ' ' + dropRec.get('name') : ' on empty view';
Ext.example.msg("Drag from left to right", 'Dropped ' + data.records[0].get('name') + dropOn);
}
}
},
store : secondGridStore,
columns : columns,
stripeRows : true,
title : 'Second Grid',
margins : '0 0 0 3'
});
//Simple 'border layout' panel to house both grids
var displayPanel = Ext.create('Ext.Panel', {
layout: 'fit',
height : 300,
layout : {
type: 'hbox',
align: 'stretch',
padding: 5
},
renderTo : 'panel',
defaults : { flex : 1 }, //auto stretch
items : [
firstGrid,
secondGrid
],
dockedItems: {
xtype: 'toolbar',
dock: 'bottom',
items: ['->', // Fill
{
text: 'Reset both grids',
handler: function(){
//refresh source grid
firstGridStore.loadData(myData);
//purge destination grid
secondGridStore.removeAll();
}
}]
}
});
});
左边网格中的字段应该是右边网格上数据的标题(来自数据库),符合我的要求。
左侧网格将具有如下网格数据:
的字段
ID
命名
数据
从左侧网格拖动数据后,右侧网格应具有如下数据:
的 ID
1
2
3
注意:此处仅拖动id。
有人能帮助我吗?
感谢。
答案 0 :(得分:2)
你可以使用“beforedrop”而不是“drop”事件,但是你可以通过为dropFunction属性分配一个新函数来设置你自己的自定义drop处理程序,希望这可以帮助你解决问题! ! 另见http://docs.sencha.com/ext-js/4-1/#!/api/Ext.grid.plugin.DragDrop
答案 1 :(得分:0)
要记住几件事情。
你的模型驱动布局 - 你要定义一个字段'Field'的'DataObject',由users.php json调用/ return填充,如果你想要json-return中的所有字段要是可拖动的,那么你需要在模型中包含所有字段,即
Ext.define('DataObject', {
extend: 'Ext.data.Model',
fields: [
'id',
'name',
'data'
]
});
字段名称必须匹配源和目标之间的拖放 - 只要你想要的拖拽字段具有相同的名称(dataField定义),那么你的拖拽代理将拉出你想要的所有项目。
< / LI>当然,如果您只想显示标题,那么您的显示将是:
items: [
{ dataIndex: 'id', hidden: true } ,
{ dataIndex: 'name', hidden: true },
{ text: 'title', dataIndex: 'data', width: xx } // loose example
]
dragdrop代理将拉出网格/表单行中的所有内容,无论是显示还是隐藏..
希望这有帮助