本案例使用了Ext.Tree.Panel的如下知识点:

1.刷新、重新加载Tree,定位到上次的节点位置

2.Tree的右键操作

3.Extjs4.x Tree获取当前选中的节点

4.新增、修改、删除Tree节点

5.修改tree节点的属性,例如text,iconCls,leaf等

6.treedata rest proxy

7.treeStore.sync的同步回调方法

8.Extjs4.x Tree获取父节点,获取子节点Chirldrens

9.Extjs4.x TreePanel的展开,收缩

10.Extjs4.x Tree的拖拽操作treeviewdragdrop插件,响应类型有before,after,append

11.Extjs4.x Guid,UUID的生成

等等。

Demo视频:

源码共享:

/// <reference path="../../Ext.js" />
Ext.define("WMS.view.OrgTree", {
extend: 'Ext.tree.Panel',
alias: 'widget.OrgTree',
id: 'orgTreePanel',
width: 200,
region: 'west',
animate: true,
autoScroll: true,
rootVisible: true,
store: 'OrgTree',
loadMsg: true,
title: '组织架构',
iconCls: 'User',
border: false,
viewConfig: {
plugins: {
ptype: 'treeviewdragdrop',
appendOnly: false
}
},
collapsible: true,//是否可以折叠
split: true,
tools: [{
type: 'expand',
handler: function () {
Ext.getCmp("orgTreePanel").expandAll();
}
}, {
type: 'collapse',
handler: function () {
Ext.getCmp("orgTreePanel").collapseAll();
}
}]
}); /************************************/
//Controller
Ext.define('WMS.controller.Org', {
extend: 'Ext.app.Controller',
stores: ['OrgUser', 'OrgTree'],
models: ['OrgUser'],
views: ['OrgTb', 'OrgTree', 'OrgTreeContextMenu', 'OrgUserGrid'],
refs: [
{
ref: 'orgTree',
selector: 'OrgTree'
},
{
ref: 'orgUserGrid',
selector: 'OrgUserGrid'
},
{
ref: 'orgTreeContextMenu',
selector: 'OrgTreeContextMenu',
autoCreate: true,
xtype: 'OrgTreeContextMenu'
}
],
init: function () {
this.control({
'OrgTree': {
itemcontextmenu: this.ShowRightMenu,
itemclick: this.TreeNodeClick
},
'OrgTreeContextMenu': {
click: this.RightMenuClick
},
'OrgTree > treeview': {
drop: this.OrgDragDrop
},
'OrgUserGrid button[action=btnDelete]': {
click: function () {
alert("btnDelete 删除");
}
},
'OrgUserGrid button[action=btnReload]': {
click: function () {
alert("btnReload 刷新");
}
} });
},
//显示右键菜单
ShowRightMenu: function (view, record, item, index, event) {
event.preventDefault();
var menu = this.getOrgTreeContextMenu();
view.select();
menu.showAt(event.getXY());
},
//响应右键菜单单击
RightMenuClick: function (menu, item, event, opts) {
//获取选中的node
tree = this.getOrgTree();
selNode = tree.getSelectionModel().selected.items[0];
treeStore = this.getOrgTree().getView().getTreeStore();
console.log(item.iconCls);
switch (item.iconCls) {
case 'Reload':
idPath = selNode.getPath("id");
tree.getStore().load({
node: tree.getRootNode(),
callback: function () {
tree.expandPath(idPath, 'id');
}
});
break;
case 'ChartOrganisationAdd':
Ext.MessageBox.prompt("新增组织架构", "名称:", function (button, text) {
if (button == "ok") {
if (Ext.util.Format.trim(text) != "") {
//设置新增节点,如果本来就是子节点,那么设置子节点leaf为false
//console.log(Ext.data.IdGenerator.get('uuid').generate());
selNode.appendChild({
text: text,
leaf: true,
iconCls: 'Group',
id: Ext.data.IdGenerator.get('uuid').generate()
});
if (selNode.get("leaf")) {
selNode.set("leaf", false);
selNode.set("iconCls", "");
}
selNode.expand();
treeStore.sync();
}
}
});
break;
case 'ChartOrgInverted':
if (selNode.data.id == "00000000-0000-0000-0000-000000000000") {
Ext.Tools.Msg("根节点不允许修改!", 9);
return;
}
Ext.MessageBox.prompt("修改组织名称", "新名称:", function (button, text) {
if (button == "ok") {
if (Ext.util.Format.trim(text) != "") {
if (selNode.data.text != text) { /* 在修改值的情况下,请求处理 */
selNode.set("text", text);
treeStore.sync();
}
}
}
}, this, false, selNode.data.text);
break;
case 'ChartOrganisationDelete':
if (selNode.data.id == "00000000-0000-0000-0000-000000000000") {
Ext.Tools.Msg("根节点不允许删除!", 9);
return;
}
if (!selNode.data.leaf) {
Ext.Tools.Alert("警告", "系统仅支持您删除叶子节点!","E");
return;
}
Ext.MessageBox.confirm("警告", "是否要删除该“"+selNode.data.text+"”组织架构?请确认该组织下已无用户!", function (button, text) {
if (button == "yes") {
parentNode = selNode.parentNode;
nextSibling = selNode.nextSibling;
//console.log(selNode.getPath("id"));
selNode.remove();
if (parentNode.childNodes.length <= 0) {
parentNode.set("leaf", true);
parentNode.set("iconCls", "Group");
}
treeStore.sync({
success: function (batch, options) {
rst = Ext.JSON.decode(batch.operations[0].response.responseText);
if (rst.result != 0) {
parentNode.insertBefore(selNode, nextSibling);
tree.getSelectionModel().select(selNode);
}
}
});
}
});
break;
case 'UserAdd':
break;
case 'GroupAdd':
break;
case 'UserCross':
break;
case 'StatusInvisible':
break;
}
},
//树拖拽操作
OrgDragDrop:function (node, data, overModel, dropPosition, eOpts) {
Ext.Ajax.request({
url: '/Admin/Org/DragDrop',
method: 'POST',
params: {
movedId: data.records[0].getId(),
referenceId: overModel.getId(),
dropPosition: dropPosition
},
success: function (response) {
rst = Ext.JSON.decode(response.responseText);
Ext.Tools.Msg(rst.msg, rst.result);
},
failure: function (response) {
Ext.Tools.Msg('请求超时或网络故障,错误编号:' + response.status, 9);
}
});
},
//获取组织架构的用户
TreeNodeClick: function (view, record, item, index) {
var id = record.getId();
var Enode = view.getTreeStore().getNodeById(id);
var idArray = new Array();
if (id != "00000000-0000-0000-0000-000000000000") {
idArray.push(id);
this.GetChilds(idArray, Enode);
}
usrstore = this.getOrgUserStore();
usrstore.getProxy().setExtraParam("ids", idArray);
usrstore.load();
},
GetChilds: function (idArray, node) {
ts = this;
childnodes = node.childNodes;
Ext.each(childnodes, function () {
var nd = this;
idArray.push(nd.getId());
if (nd.hasChildNodes()) {
ts.GetChilds(idArray, nd);
}
});
}
});

不想动脑子,直接获取源码的,给点辛苦费(我也是苦逼熬了好几个夜晚才弄出来):http://item.taobao.com/item.htm?spm=0.0.0.0.sEb3r6&id=18977330762

Extjs4.2 Tree使用技巧小结demo的更多相关文章

  1. Extjs4.2 Tree使用技巧

    Extjs4.2 Tree使用技巧小结demo 本案例使用了Ext.Tree.Panel的如下知识点: 1.刷新.重新加载Tree,定位到上次的节点位置 2.Tree的右键操作 3.Extjs4.x ...

  2. PowerDesigner实用技巧小结(3)

    PowerDesigner实用技巧小结(3) PowerDesigner 技巧小结 sqlserver数据库databasevbscriptsqldomain 1.PowerDesigner 使用 M ...

  3. PowerDesigner实用技巧小结(2)

    PowerDesigner实用技巧小结 1.ORACLE数据库建模时,由于ORACLE的表名.字段名如果是小写会有一定的麻烦,需要将小写转化为大写? (1)在打开pdm的情况下,进入Tools-Mod ...

  4. CentOS系统中的passwd命令实用技巧小结

    这篇文章主要介绍了Linux系统中的passwd命令实用技巧小结,是Linux入门学习中的基础知识,需要的朋友可以参考下   先来回顾一下passwd命令的基本用法: Linux passwd命令用来 ...

  5. github搜索技巧小结

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. Extjs4.x Tree树刷新,默认选中展开到最后一次选中的节点

    跟Extjs3.0不同Extjs4.2的写法如下: idPath = selNode.getPath("id"); tree.getStore().load({ node: tre ...

  7. Eclipse使用技巧小结

    前言:自学Java以来,就一直用eclipse,这款ide深受广大新手和大牛喜爱.学会使用其中的技巧,越用越熟练,开发也就越快捷方便.话不多说,直接上小结吧. 一.快捷键 1.提示 :A|t+/ 2. ...

  8. GMap.Net开发之技巧小结

    1.在GMap地图上,如果要让添加的图标(Marker)有个高亮(highlight)的效果,可以在MouseOver到Marker的时候设置Marker外观效果. 如果要让图标有个报警闪烁的效果,可 ...

  9. PowerDesigner实用技巧小结(4)

    下述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的.对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握.并逐步做到:在应用中发展,在发展中应用. 1. ...

随机推荐

  1. wget for windows

    那么,来尝试下wget for windows 吧. 什么是wget? wget是一个强力方便的命令行下的下载工具,可以通过HTTP和FTP协议(两种最广泛的互联网协议)从因特网中检索并获取文件. 此 ...

  2. Spring Boot启动过程及回调接口汇总

    Spring Boot启动过程及回调接口汇总 链接: https://www.itcodemonkey.com/article/1431.html 来自:chanjarster (Daniel Qia ...

  3. SNF微信公众号客户端演示-微信开发客户端能干什么

    关注测试微信号: 关注后菜单页面如下: 一.扫描二维码进行订单查询演示 1.点击菜单“软件产品”->选择“扫描查询” 2.扫描如下二维码进行订单查询演示. 3.扫描结果如下: 二.微信“输入订单 ...

  4. JS两日期相减

    JS两日期相减,主要用到下面两个方法 dateObject.setFullYear(year,month,day) 方法 stringObject.split(separator) 方法 functi ...

  5. Android应用的基本原理

    原文:http://android.eoe.cn/topic/android_sdk 应用基础-Application Fundamentals Android应用程序以java作为开发语言.用And ...

  6. 【转】10个非常有用的网页设计工具 | Goodfav Magazine

    10+ very useful Web Designer Tools Totally free legal computer eBooks download, available in various ...

  7. javascript <a> 标签打开相对路径,绝对路径

    <a>标签中的href中,如果你写一个路径默认是以相对路径打开的,加上"http://" 消息头那就可以打开绝对路径 html: <a href=javascri ...

  8. 【Unity】11.6 恒定力 (Constant Force)

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 恒定力 (Constant Force) 是用于向刚体 (Rigidbody) 添加恒定力的快速实用工具,适用于类似火箭 ...

  9. nginx check_http_send type=http 查检测不到后端TOM的存活

    原因:定位到../conf/server.xml中 <Connector port="8020" protocol="org.apache.coyote.http1 ...

  10. Git详解之Git分支

    Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的 ...