`
babydeed
  • 浏览: 237947 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

tree拖拽

    博客分类:
  • Ext
 
阅读更多

当时遇到如下问题:

拖拽A tree 的a节点到B tree ,a节点可以顺利地被添加到了B tree中,我的问题是如何此时还让a 节点留在在A tree中,而不是彻底给了B tree。
这里做一下当时的一种解决方法,或许不是最好的方法 (大概思路是退拽完 往回追加所拖拽的node)
当时ext使用版本 3.3
首先 使tree的node具有clone方法
代码如下:
  
Ext.override(Ext.tree.TreeNode, {
     clone: function() {
	    var atts = this.attributes;
             if(this.childrenRendered || this.loaded || !this.attributes.children) {
				var clone = new Ext.tree.TreeNode(Ext.apply({}, atts));
     		 }
		     else {
					var newAtts = Ext.apply({}, atts);
					newAtts.children = this.cloneUnrenderedChildren();
					var clone = new Ext.tree.AsyncTreeNode(newAtts);
		     }
      		clone.text = this.text;
		    for(var i=0; i<this.childNodes.length; i++){
				clone.appendChild(this.childNodes[i].clone());
		    }
		    return clone;
	  },
	
    cloneUnrenderedChildren: function() {
      	unrenderedClone = function(n) {
	        if(n.children) 
	        {
				for(var j=0; j<n.children.length; j++) {
				   n.children[j] = unrenderedClone(n.children[j]);
				}
	        }	
	        return n;
    	 };
    	var c = [];
		for(var i=0; i<this.attributes.children.length; i++) {
				c[i] = Ext.apply({}, this.attributes.children[i]);
				c[i] = unrenderedClone(c[i]);
		}
			return c;
		}
});
 下面造2个树 :
    第1个树
       // yui-ext tree
            var tree = new Tree.TreePanel({
                animate:true, 
                autoScroll:true,
                loader: new Tree.TreeLoader(),
                enableDD:true,
                containerScroll: true,
                border: false,
                width: 250,
                height: 300,
                dropConfig: {appendOnly:true}
            });
            
            
            // set the root node
            var root = new Tree.AsyncTreeNode({
                text: 'Ext JS', 
                draggable:false, // disable root node dragging
                id:'src',
    children: [
     {text: '节点1',id:"node_1",leaf: true},
     {text: '节点2',id:"node_2",leaf: false,children: [
      {text: '节点21',id:"node_21",leaf: true},
      {text: '节点22',id:"node_22",leaf: true}
     ]}
    ]
            });
            tree.setRootNode(root);
            
            tree.render('tree');
            
            root.expand(true, true);
 第2个树:
         // ExtJS tree            
            var tree2 = new Tree.TreePanel({
                animate:true,
                autoScroll:true,
                rootVisible: false,
                loader: new Ext.tree.TreeLoader(),
                containerScroll: true,
                border: false,
                width: 250,
                height: 300,
                enableDrop :true,
                dropConfig: {appendOnly:true,allowParentInsert:false},
                listeners:{
						"contextmenu":function(node,e){
							var menu = new Ext.menu.Menu([
								{text:"上移",iconCls:'up',handler:function(){
										var nodeUp =  new Ext.tree.TreeNode(Ext.apply({}, node.attributes));;
										var previousNode = node.previousSibling; 
										var pNode = node.parentNode;
										node.remove();
										pNode.insertBefore(nodeUp,previousNode);
									}
								},
								{text:"下移",iconCls:'down',handler:function(){
										var nodeUp =  new Ext.tree.TreeNode(Ext.apply({}, node.nextSibling.attributes));;
										var previousNode = node.previousSibling; 
										var pNode = node.parentNode;
										node.nextSibling.remove();
										pNode.insertBefore(nodeUp,node);										
									}
								},
								{text:"删除",iconCls:'right_delete',handler:function(){
										node.parentNode.removeChild(node);
									}
								},								
								{text:"重命名",iconCls:'right_rename',menu:new Ext.menu.Menu({
								        items: [
								           new Ext.form.FormPanel({
											        title: '输入',
											        frame: true,
											        defaultType: 'textfield',
											        labelWidth: 30,
											        width:190,
											        items: [{
											            fieldLabel: '名称',
											            name: 'name'
											        }],
											        buttons: [{
											            text: '确认',
											            //scope:this,
											            handler:function(){
											              var s = this.findParentByType("form").form.findField("name").getValue();
											              node.setText(s);
											              menu.hide();
											            }
											        }, {
											            text: '取消',handler:function(){
											             menu.hide();
											            }
											        }]
											    })
								        ]
								    })
								}
							]);
							if(!node.previousSibling){
								menu.items.item(0).disable();
							}
							if(!node.nextSibling){
								menu.items.item(1).disable();
							}
							menu.showAt(e.getPoint());
						}
					}//监听结束	
            });
           
            
            // add the root node
            var root2 = new Tree.AsyncTreeNode({
                text: 'Extensions', 
                draggable:false, 
                id:'ux',
				children: [
					{text: '节点3',id:"node_3",zyid:"node_3",leaf: false,children: [
						{text: '节点22',id:"node_22",zyid:"node_22",leaf: true}
					]},
					{text: '节点4',id:"node_4",zyid:"node_4",leaf: false,children: [
						{text: '节点21',id:"node_2",zyid:"node_21",leaf: true}
					]}
				]
            });
		   tree2.on("beforenodedrop",function(e){
            	//alert( e.data.node.text );取得拖拽的node
            	if(e.dropNode.getOwnerTree()==tree){
            			if(e.data.node.hasChildNodes()){
		            		e.cancel=true;
		            		Ext.Msg.alert('系统提示', '不允许拖拽目录!');            				
            			}else{
	 		             	var isAllowDrag = true;
			            	var parentNode = e.target;
			            	var parentNodeChild = parentNode.childNodes;
			            	for(var i = 0;i<parentNodeChild.length;i++){
			            		if(parentNodeChild[i].attributes.zyid==e.dropNode.id){
			            			isAllowDrag=false;
			            			break;
			            		}	
			            	}
			            	if(isAllowDrag==true){
			            		e.cancel=false;
			            		e.dropNode = e.dropNode.clone(); //追加回节点
			            		e.dropNode.attributes.zyid = e.dropNode.id; 
			            		e.dropNode.allowChildren=false;
			            	}else{
			            		e.cancel=true;
			            		Ext.Msg.alert('系统提示', '此业务流程已经存在该节点!');
			            	}               			
            			
            			}
		            		
            	}; 
            })
            tree2.setRootNode(root2);
            tree2.render('tree2');
            
            root2.expand(true, true);
  
   
自此结束  以上仅是本人的一个做法  或许麻烦 或许有更好的办法
分享到:
评论

相关推荐

    基于vue、iview实现tree组件可拖拽、双击编辑

    在这个场景下,我们将探讨如何利用Vue和IView实现一个具有拖拽和双击编辑功能的Tree组件。 首先,让我们了解一下`Tree`组件。在Web应用中,`Tree`组件通常用于展示层级关系的数据,如文件系统、组织结构等。IView中...

    基于iView和he-tree-vue的一个拖拽树形组件

    3. **拖拽功能**:用户可以通过鼠标拖动节点改变树形结构,这种功能在组织结构、任务分配或者文件管理场景下非常实用,允许用户自由调整数据层次关系。 4. **增、删、改功能**:组件支持添加新的子节点、删除节点...

    完成Ext tree 拖拽节点到 textfield 控件中

    以前有许多人需要将 tree 的节点拖拽到其他控件中的问题,前段时间已经解决了,现在也将它的源代码贡献上来。 这个树的数据是静态的,没有做动态的,而且树节点的拖拽也没有做过多的处理,如果要知道怎么样做树...

    flex tree 拖拽

    拖拽功能则为 Tree 提供了更丰富的交互性,让用户可以通过拖放操作来重新排列节点或移动节点到不同的位置,这在需要调整结构或分类数据的场景中非常有用。 在 Flex Tree 的拖拽操作中,主要涉及以下几个核心知识点...

    easyui datagrid 拖拽到 tree

    总的来说,实现“easyui datagrid 拖拽到 tree”的功能,需要深入理解EasyUI组件的内部机制,熟悉拖放API,以及具备一定的JavaScript编程能力。通过以上步骤,我们可以创建一个交互性强、用户体验良好的应用,使得...

    el-tree创建结构线,并且可拖动

    el-tree创建结构线,并且可拖动

    Flex 4.5 实现tree拖拽到任意组建

    本教程将详细介绍如何在Flex 4.5中实现Tree组件与任意组件之间的拖放操作,特别是将树形结构的数据拖拽到DataGrid中,并获取目标位置的全部数据进行添加。 1. **Flex 4.5的DragManager和DropTarget** Flex 4.5中的...

    EasyUI实现两个treegrid互相拖放

    本代码在EasyUI官网原treegrid拖放demo的基础上进行详尽的注释,并加以改动,如今可以实现两个treegrid之间互相拖放,本代码分别可以进行“剪切”和“复制”的功能,当前使用的是“剪切”功能,可通过改变treegrid-...

    VC.drag.tree.control.design.rar_VC 树形_drop_tree 拖拽_拖拽tree_树 拖拽

    "VC.drag.tree.control.design.rar"这个压缩包提供了一组代码资源,专门用于实现这样的功能。下面将详细介绍如何在VC++中设计和实现一个支持拖放操作的树形控件。 首先,我们需要理解拖放(Drag and Drop)的基本...

    ext的tree两个拖拽例子

    `DragSource`定义了可拖动的对象,而`DropTarget`则定义了可以接收拖动对象的目标区域。在TreePanel中,我们可以为每个节点实例化一个`DragSource`,并为整个TreePanel设置一个`DropTarget`。 第一个拖放例子可能...

    layui-tree树形组件改写,可编辑、上移、下移、拖拽修改

    将文件直接复制到layui/lay/modules目录下,会覆盖layui原有的tree.js,调用方法与layui树形组件的适应方式一致,新增的方法可在文件中查看

    vue树可拖动拖动项目排序

    首先,"vue-sortable-tree"是一个专门用于Vue.js的树形组件库,它提供拖放排序功能,允许用户通过鼠标拖动节点来调整树形结构中的项目顺序。在安装这个库时,你可以通过npm(Node Package Manager)进行操作: ```...

    基于Vue.js的可拖拽树组件

    - Vue.js社区中有多个成熟的树形组件库,如`element-ui`的Tree组件,`vuetify`的Treeview,以及本案例中的拖拽树组件。 3. **拖拽功能** - 拖拽功能是通过HTML5的`drag and drop` API实现的,该API允许用户通过...

    vue elementui tree 任意级别拖拽功能代码

    在本文中,我们将探讨如何实现 Vue ElementUI Tree 组件的任意级别拖拽功能,这对于构建可自定义排序的层级结构数据展示非常有用。 在 ElementUI 的 Tree 组件中,`draggable` 属性用于开启拖拽功能,`allow-drop` ...

    树形控件拖曳放置及移动_labview_labview树形控件_树形控件(tree)

    3. 用户反馈:为了提高用户体验,可以添加视觉反馈,如拖动时的高亮显示,以及拖放成功或失败的提示信息。 通过以上步骤,你可以在LabVIEW中实现对树形控件的拖曳放置和移动操作,从而增强你的应用程序的交互性和可...

    jQuery EasyUI tree 使用拖拽时遇到的错误小结

    在我使用tree拖拽时总是失败,控制台输出了很多错误。 经过跟踪分析发现这是一个由于特殊配置导致的错误。 原先错误的代码如下: $('#tree').tree({ //省略其他 loadFilter: function(data, parent){ return data....

    MFC Tree Control 拖动实现

    MFC Tree Control是MFC框架中的一个重要组件,用于显示和管理具有层次结构的数据,类似于Windows资源管理器的左侧目录树。在本教程中,我们将深入探讨如何在MFC中实现Tree Control的拖放功能,这是一项扩展功能,...

    flex tree+checkbox级联勾选

    在IT行业中,Flex Tree是一种常用于数据展示和交互的组件,尤其在构建用户界面时,它能够以树形结构清晰地展示层次数据。配合Checkbox(复选框)功能,可以提供用户选择或过滤数据的便利操作。"Flex Tree + Checkbox...

    flex中 Tree树节点内部拖动实例(此实例限制了什么节点可以拖动及拖动到什么位置)

    在本文中,我们将详细探讨如何在Flex的Tree组件中实现节点的拖放操作,并且限制可拖动的节点以及拖动的目标位置。 首先,我们需要了解Flex Tree组件的基本用法。Tree组件用于显示层次结构的数据,每个节点代表数据...

    jquery拖拽树形菜单

    containment: "#treeMenu", // 只能在树形菜单内拖动 }); $("#treeMenu").droppable({ accept: "#treeMenu li", // 接受同级li元素 drop: function(event, ui) { var draggedNode = ui.draggable; // 被拖动的...

Global site tag (gtag.js) - Google Analytics