Javascript 从网格拖放到树,而不添加树节点

Javascript 从网格拖放到树,而不添加树节点,javascript,extjs,drag-and-drop,extjs4,Javascript,Extjs,Drag And Drop,Extjs4,嘿,那里 我希望能够将项目(书签)从网格拖动到树(类别),但我不希望将删除的书签项目作为新节点添加到类别树,也不希望将其从网格中删除。我只想捕获dropnode事件并更新书签的类别id 如何做到这一点?到目前为止,我得到了以下信息: Ext.onReady(函数(){ //定义树的模型 Ext.define('类别'{ 扩展:“Ext.data.Model”, 字段:[ {name:'id',type:'int'}, {name:'parentCatId',键入:'int'}, {name:'

嘿,那里

我希望能够将项目(书签)从网格拖动到树(类别),但我不希望将删除的书签项目作为新节点添加到类别树,也不希望将其从网格中删除。我只想捕获dropnode事件并更新书签的类别id

如何做到这一点?到目前为止,我得到了以下信息:

Ext.onReady(函数(){
//定义树的模型
Ext.define('类别'{
扩展:“Ext.data.Model”,
字段:[
{name:'id',type:'int'},
{name:'parentCatId',键入:'int'},
{name:'name',type:'string'}
]
});
//为网格定义模型
Ext.define('书签'{
扩展:“Ext.data.Model”,
字段:[
{name:'id',type:'int'},
{name:'catId',type:'int'},
{name:'title',type:'string'},
{name:'url',type:'string'}
]
});
//创建树面板
var catTree=Ext.create('Ext.tree.Panel'{
itemId:“catTree”,
标题:“类别”,
弹性系数:0.5,
隐藏者:没错,
rootVisible:false,
allowDeselect:正确,
视图配置:{
插件:{
p类型:“treeviewdragdrop”,
dropGroup:'bkmDDGroup',
enableDrag:false,
仅附件:正确
}
},
存储区:Ext.create('Ext.data.TreeStore'{
型号:'类别',
代理:{
键入:“内存”,
读者:{
键入:“json”,
根:“类别”
}
}
}),
root:[],
栏目:[{
xtype:'树柱',
数据索引:“名称”,
弹性:1
}],
听众:{
afterrender:函数(树){
var root=tree.getRootNode();
//加载静态数据
root.appendChild([{
id:0,
parentCatId:-1,
名称:“Cat1”,
对,,
类别:[{
id:2,
parentCatId:0,
名称:“Cat1.1”,
类别:[]
},{
id:3,
parentCatId:0,
名称:“Cat1.2”,
类别:[]
}]
},{
id:1,
parentCatId:-1,
名称:'Cat2',
类别:[]
}]);
//选择第一项
tree.getSelectionModel().select(root.getChildAt(0));
},
selectionChange:功能(型号、选定项、选项){
bkmGrid.filterBookmarks((selected&&selected[0])?selected[0]。get('id'):-1);
}
}
});
//创建网格面板
var bkmGrid=Ext.create('Ext.grid.Panel'{
itemId:'bkmGrid',
标题:“书签”,
弹性:1,
视图配置:{
插件:{
p类型:“gridviewdragdrop”,
dragGroup:'bkmDDGroup'
}
},
存储:Ext.create('Ext.data.store'{
型号:“书签”,
代理:{
键入:“内存”
},
数据:[
{id:0,catId:0,标题:'bkm1',url:'http://www.url1.com' },
{id:1,catId:0,标题:'bkm2',url:'http://www.url2.com' },
{id:2,catId:1,标题:'bkm3',url:'http://www.url3.com' },
{id:3,catId:1,标题:'bkm4',url:'http://www.url4.com' },
{id:4,catId:2,标题:'bkm5',url:'http://www.url5.com' },
{id:5,catId:3,标题:'bkm6',url:'http://www.url6.com' }
]
}),
栏目:[{
文本:“标题”,
数据索引:“标题”,
弹性:0.7
},{
文本:“URL”,
数据索引:“url”,
弹性:1,
渲染器:函数(值、元){
meta.tdAttr='data qtip=“”+value+”;
返回“”;
}
}],
filterBookmarks:函数(catId){
var store=this.getStore();
store.clearFilter();
如果(catId>=0){
store.filter('catId',catId);
}
}
});
//创建保存数据视图的窗口
Ext.create('Ext.window.window'{
宽度:500,
身高:300,
布局:{
类型:“hbox”,
对齐:“拉伸”
},
项目:[catTree,bkmGrid]
}).show();
});
在树上放置书签后,会引发以下异常:
“未捕获的TypeError:对象[Object Object]没有方法'updateInfo'”

异常在appendChild方法中抛出,该方法最终不应被调用。因此,异常并不重要,但如何防止树在删除后尝试添加新节点


谢谢

我刚刚找到了一个如下所示的解决方案:

“魔法”就是删除beforedrop侦听器中的记录数组。删除之前,我将数组保存到树的自定义配置对象(this.droppedRecords)中,以便能够在drop listener中再次访问数据:

    viewConfig: {
        plugins: {
            ptype: 'treeviewdragdrop',
            dropGroup: 'bkmDDGroup',
            enableDrag: false,
            appendOnly: true
        },
        listeners: {
            beforedrop: function(node, data, overModel, dropPos, opts) {
                this.droppedRecords = data.records;
                data.records = [];
            },
            drop: function(node, data, overModel, dropPos, opts) {
                var str = '';
                Ext.iterate(this.droppedRecords, function(record) {
                    str += record.get('title') + ' (id = ' + record.get('id') + ') dropped on ' + overModel.get('name') + '\n';
                });
                alert(str);

                this.droppedRecords = undefined;
            }
        }
    },
就这样


谢谢

我刚刚找到了一个如下所示的解决方案:

“魔法”就是删除beforedrop侦听器中的记录数组。德莱蒂之前
    viewConfig: {
        plugins: {
            ptype: 'treeviewdragdrop',
            dropGroup: 'bkmDDGroup',
            enableDrag: false,
            appendOnly: true
        },
        listeners: {
            beforedrop: function(node, data, overModel, dropPos, opts) {
                this.droppedRecords = data.records;
                data.records = [];
            },
            drop: function(node, data, overModel, dropPos, opts) {
                var str = '';
                Ext.iterate(this.droppedRecords, function(record) {
                    str += record.get('title') + ' (id = ' + record.get('id') + ') dropped on ' + overModel.get('name') + '\n';
                });
                alert(str);

                this.droppedRecords = undefined;
            }
        }
    },