`

Ext树节点右键菜单

阅读更多
1./** 
2. * 项目树 
3. */ 
4.Divo.app.Project = function() {  
5.    /* ----------------------- private变量 ----------------------- */ 
6.    var treeEl = 'project-tree';  
7. 
8.    var tree, root, treeEditor, root, ctx, ctxNode;  
9.    var adding, editing;  
10.    var seed = 0;  
11. 
12.    /* ----------------------- private方法 ----------------------- */ 
13.    // 创建项目树  
14.    function createTree() {  
15.        var xt = Ext.tree;  
16.        tree = new xt.TreePanel( {  
17.            el : treeEl,  
18.            animate : true,  
19.            enableDD : false,  
20.            containerScroll : true,  
21.            lines : false,  
22.            rootVisible : false,  
23.            root : new Ext.tree.TreeNode()  
24.        });  
25.        root = tree.root;  
26. 
27.        var o;  
28.        BasisFacade.findAllProjects( {  
29.            callback : function(retValue) {  
30.                o = retValue;  
31.            },  
32.            async : false 
33.        });  
34.        if (o) {  
35.            for (var i = 0;i < o.length; i++) {  
36.                var n = new xt.TreeNode( {  
37.                    id : o[i].id,  
38.                    text : o[i].name,  
39.                    leaf : true 
40.                });  
41.                root.appendChild(n);  
42.            }  
43.        }  
44. 
45.        var selModel = tree.getSelectionModel();  
46.        selModel.on('selectionchange', onNodeSelected, this, true);  
47. 
48.        tree.on('contextmenu', onContextShow, this);  
49.        // tree.render();  
50.        // root.expand();  
51.    }  
52. 
53.    // 创建TreeEditor  
54.    function createTreeEditor() {  
55.        var xt = Ext.tree;  
56. 
57.        treeEditor = new xt.TreeEditor(tree, {  
58.            allowBlank : false,  
59.            blankText : '请输入项目名称',  
60.            selectOnFocus : true 
61.        });  
62. 
63.        treeEditor.on("complete", onNodeEdited, this, true);  
64.    }  
65. 
66.    // 开始新建项目  
67.    function onAddNode() {  
68.        var node = new Ext.tree.TreeNode( {  
69.            text : '项目' + (++seed),  
70.            id : 'c1' 
71.        });  
72.        adding = true;  
73. 
74.        root.appendChild(node);  
75.        root.expand();  
76.        node.select();  
77.        root.lastChild.ensureVisible();  
78.        treeEditor.triggerEdit(node);  
79.    }  
80. 
81.    // 开始修改项目名称  
82.    function onUpdateNode() {  
83.        if (!ctxNode) {  
84.            Divo.say("请先选择某个项目");  
85.            return;  
86.        }  
87.        treeEditor.triggerEdit(ctxNode);  
88.    }  
89. 
90.    // 删除项目  
91.    function onDeleteNode() {  
92.        if (!ctxNode) {  
93.            Divo.say("请先选择某个项目");  
94.            return;  
95.        }  
96.        if (ctxNode.isLast()){  
97.            Divo.say("最后一个项目不能删除");  
98.            return;  
99.        }  
100.        var id = ctxNode.attributes.id;  
101.        var o;  
102.        BasisFacade.deleteProject(id, {  
103.            callback : function(retValue) {  
104.                o = retValue;  
105.            },  
106.            async : false 
107.        });  
108.        if (!o.success) {  
109.            Divo.alert("删除失败(可能已经启用)");  
110.            return;  
111.        }  
112.        root.removeChild(ctxNode);  
113.        if (ctxNode.lastChild)  
114.            ctxNode.lastChild.select();  
115.              
116.        ctxNode = null;   
117.    }  
118. 
119.    // 项目树编辑结束处理  
120.    function onNodeEdited(o, newText, oldText) {  
121.        var result;  
122.        var node = o.editNode;  
123.        if (adding) {  
124.            BasisFacade.addProject( {  
125.                name : newText  
126.            }, {  
127.                callback : function(retValue) {  
128.                    result = retValue;  
129.                },  
130.                async : false 
131.            });  
132.            if (!result.success) {  
133.                Divo.say("[" + newText + "]保存失败(可能名称重复)。");  
134.                root.removeChild(node);  
135.            } else {  
136.                node.attributes.id = result.newId;  
137.            }  
138.        } else {  
139.            BasisFacade.updateProject( {  
140.                id : node.attributes.id,  
141.                name : newText  
142.            }, {  
143.                callback : function(retValue) {  
144.                    result = retValue;  
145.                },  
146.                async : false 
147.            });  
148.            if (!result.success) {  
149.                node.setText(oldText); //TODO: 不起作用了!  
150.                Divo.say("[" + newText + "]保存失败(可能名称重复)。");  
151.            }  
152.        }  
153.        editing = false;  
154.        adding = false;  
155.    }  
156. 
157.    // 选择项目  
158.    function onNodeSelected(sm, node) {  
159.        if (!node)  
160.            return;  
161.        if (!editing && !adding) {  
162.            var project = {  
163.                id : node.attributes.id,  
164.                name : node.attributes.text  
165.            };  
166.            Divo.publish(Divo.msg.PROJECT_CHANGE, project);  
167.        } // 会失去焦点  
168.    }  
169. 
170.    // 创建上下文菜单  
171.    function createContextMenu() {  
172.        if (ctx)  
173.            return;  
174. 
175.        ctx = new Ext.menu.Menu( {  
176.            id : 'project-ctx',  
177.            items : [ {  
178.                text : '新建',  
179.                icon : Divo.getIconAdd(),  
180.                scope : this,  
181.                handler : onAddNode  
182.                    },{  
183.                text : '修改',  
184.                icon : Divo.getIconEdit(),  
185.                scope : this,  
186.                handler : onUpdateNode  
187.                    }, '-', {  
188.                text : '删除',  
189.                icon : Divo.getIconDelete(),  
190.                scope : this,  
191.                handler : onDeleteNode  
192.                }]  
193.        });  
194.        ctx.on('hide', onContextHide, this);  
195.    }  
196. 
197.    // 右击树节点时  
198.    function onContextShow(node, e) {  
199.        createContextMenu();  
200.          
201.        if(ctxNode){  
202.           ctxNode.ui.removeClass('x-node-ctx');  
203.        }  
204.        if (node) {  
205.           ctxNode = node;  
206.           ctxNode.ui.addClass('x-node-ctx');  
207.        }  
208.          
209.        ctx.showAt(e.getXY());  
210.    }  
211. 
212.    // 隐藏上下文菜单时  
213.    function onContextHide(){  
214.        if(ctxNode){  
215.            ctxNode.ui.removeClass('x-node-ctx');  
216.            ctxNode = null;  
217.        }  
218.    }  
219.      
220.    /* ----------------------- public方法 ----------------------- */ 
221.    return {  
222.        /** 
223.         * 初始化 
224.         */ 
225.        init : function() {  
226.            createTree();  
227.            createTreeEditor();  
228.        },  
229.        /** 
230.         * 返回树对象 
231.         */ 
232.        getTree : function() {  
233.            return tree;  
234.        }  
235. 
236.    }; // return  
237. 
238.}();  
分享到:
评论

相关推荐

    ext带右键菜单的树

    在描述中提到的"ext带右键菜单的树"是指在ExtJS中实现的一种交互功能,即在树形控件上通过右键点击来显示一个上下文菜单。这种功能极大地提高了用户与应用程序的交互性,使得操作更加直观和便捷。 在ExtJS中,树形...

    ExtJS 自定义树组件 节点的操作 搜索 右键菜单

    功能: 1.实现ExtJS tree 节点右键菜单 实现增删查. 2.实现针对实体数据的动态搜索. 3.代码命名规范,简单易懂. 4.支持IE 9,FF 19.0.2. 5.将文件解压至ext包example任意组件文件夹即可浏览效果.

    Ext 中的Tree实现不同节点不同的右键菜单

    本篇将深入探讨如何在`Ext JS`中实现Tree组件的不同节点拥有不同的右键菜单,这对于提供定制化的用户体验是非常有用的。 `Ext JS`的Tree组件是一个可扩展的树形结构,用于展示层级数据。在默认情况下,Tree的所有...

    复选框的且带右键菜单的树代码

    ### 复选框的且带右键菜单的树代码知识点解析 #### 一、概述 本文档介绍了一段实现带有复选框功能以及右键菜单的树形结构代码。该树形结构主要用于展示联系人信息,并支持用户进行一系列操作如搜索、添加、删除等。...

    功能更强的树节点

    在本案例中,我们看到的关键词"拖拽"和"右键菜单"都是这种树形节点增强功能的典型例子。 首先,"拖拽"功能允许用户通过鼠标将树节点从一个位置移动到另一个位置,这对于需要重新排序或移动数据的场景非常有用。实现...

    ext+ssh树,带右键功能

    【标题】"ext+ssh树,带右键功能"指的是在Web应用开发中,结合EXTJS(EXT)和Struts2(SSH)框架构建的一种特殊交互界面,它包含了一个能够展示层级结构数据的树形组件,并且具备了右键菜单功能。EXTJS是一款强大的...

    Ext 2.0 树形机构

    Ext2.0不仅仅实现了复选框的树形菜单,而且使得在选中某个节点时,如果有子节点,那么就能够将所有的字节点全部选中,当然你也可以直接选择你希望的节点。但是,当你第一次选中某个有子节点但是子节点并没有展开的...

    简单的ext树

    你可以设置节点的样式,定义展开/折叠节点的动画,甚至添加右键菜单和拖放功能。 6. **事件监听**: `Ext.tree.Panel`支持各种事件监听,如节点点击、展开、折叠等。通过监听这些事件,可以实现与树的交互逻辑,...

    ext-tree.rar_ext_ext tr_ext tre_ext.tr_ext.tree

    【标题】"ext-tree.rar_ext...综上所述,这个压缩包提供了一个使用Ext JS创建具有右键菜单功能的树形视图的实例,该视图可以直接操作数据库,对于学习和理解如何在Web应用中集成交互式树形组件和数据库操作非常有价值。

    EXT实现动态树的功能

    例如,添加节点可以监听`contextmenu`事件,然后在右键菜单上添加“添加”选项: ```javascript treeView.on('itemcontextmenu', function(view, record, item, index, event) { event.preventDefault(); var ...

    Ext+Java 树

    本例子采用ext3.0+java开发的树结构,完全的动态管理,树结构一旦形成,支持右键菜单,进行增删改,增加,就在树当前节点下创建一个新的节点,利用ajax同步到数据库,总之类似于资源管理器的增删改,由于本人是初学...

    磁盘目录树(EXT-js)

    5. **事件处理**:EXT-js提供了丰富的事件机制,如`itemclick`、`itemcontextmenu`等,你可以根据需要绑定事件处理器,实现点击目录时打开、右键菜单时的上下文操作等。 6. **自定义图标**:通过设置TreeNode的`...

    ExtRightMenuTree

    使用这个扩展,你可以快速地为树节点添加功能丰富的右键菜单,而无需过多关注底层实现。 在实际应用中,ExtRightMenuTree可能还包括其他高级特性,如权限控制(决定哪些用户可以执行特定操作)、异步加载(仅在需要...

    ztree+dwr实现的异步加载树形菜单

    它支持多种操作,如点击节点、拖拽节点、右键菜单等,且提供了丰富的API和回调函数,便于开发者进行扩展和定制。ZTree 2.6版本相比早期版本,优化了性能,增加了更多功能,例如支持多选、半选、自定义图标等,使得树...

    ext导步树完整实例

    - 在实际应用中,可能还需要实现节点的展开/折叠、拖放操作、右键菜单、节点点击事件等功能。EXTJS提供了丰富的API和事件处理机制来支持这些高级特性。 6. **示例代码**: - 实例代码会包含创建TreePanel,配置...

    EXT tree 使用 实例 最新

    8. **扩展和插件**:EXT Tree有丰富的扩展和插件,如`checkbox`(复选框节点)、`contextmenu`(右键菜单)等,可以进一步增强功能。 在文档`extjs的tree的使用.doc`中,你将找到关于如何设置这些配置、创建树实例...

    ExtJs树例子

    同时,用户可以通过点击、拖拽、右键菜单等方式与树进行交互。例如,可以监听`click`、`expand`、`collapse`等事件来进行相应的操作。 6. **扩展性**:ExtJS的树形控件具有高度的可扩展性,可以通过插件(plugins)...

    EXT2.0中文教程

    9.6. JsonView实现用户卡片拖拽与右键菜单 9.7. 下拉列表选择每页显示多少数据 10. 撕裂吧!邪魔外道与边缘学科。 10.1. dwr与ext整合 10.1.1. 无侵入式整合dwr和ext 10.1.2. DWRProxy 10.1.3. DWRTreeLoader 10.2...

Global site tag (gtag.js) - Google Analytics