Extjs4.2 Tree使用技巧小结demo

本案例使用了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);
}
});
}
});

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

  1. Extjs4.2 Tree使用技巧小结demo

    本案例使用了Ext.Tree.Panel的如下知识点: 1.刷新.重新加载Tree,定位到上次的节点位置 2.Tree的右键操作 3.Extjs4.x Tree获取当前选中的节点 4.新增.修改.删除 ...

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

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

  3. HDU 5416 CRB and Tree (技巧)

    题意:给一棵n个节点的树(无向边),有q个询问,每个询问有一个值s,问有多少点对(u,v)的xor和为s? 注意:(u,v)和(v,u)只算一次.而且u=v也是合法的. 思路:任意点对之间的路径肯定经 ...

  4. ExtJs4之TreePanel

    Tree介绍 树形结构,是程序开发,不可缺少的组件之一.ExtJs中的树,功能强大美观实用.功能齐全,拖拉,排序,异步加载等等. 在ExtJs4中Tree和Grid具有相同的父类,因此Grid具有的特 ...

  5. ExtJS 4 树

    Tree Panel是ExtJS中最多能的组件之一,它非常适合用于展示分层的数据.Tree Panel和Grid Panel继承自相同的基类,所以所有从Grid Panel能获得到的特性.扩展.插件等 ...

  6. AC 自动机学习笔记

    虽然 NOIp 原地爆炸了,目前进入 AFO 状态,但感觉省选还是要冲一把,所以现在又来开始颓字符串辣 首先先复习一个很早很早就学过但忘记的算法--自动 AC AC自动机. AC 自动机能够在 \(\ ...

  7. Extjs4中的常用组件:Grid、Tree和Form

    至此我们已经学习了Data包和布局等API.下面我们来学习作为Extjs框架中我们用得最多的用来展现数据的Grid.Tree和Form吧! 目录: 5.1. Grid panel 5.1.1. Col ...

  8. Extjs4.x Ext.tree.Panel 过滤Filter以及trigger field的使用

    Extjs4.x中已经取消了组件Ext.Tree.TreeFilter功能,却掉了树形结构的过滤功能,要实现该功能只能自己写了. Tree节点筛选UI很简单,一个Tbar,一个trigger即可解决问 ...

  9. Maven类包冲突终极三大解决技巧 mvn dependency:tree

    Maven对于新手来说是<步步惊心>,因为它包罗万象,博大精深,因为当你初来乍到时,你就像一个进入森林的陌生访客一样迷茫. Maven对于老手来说是<真爱配方>,因为它无所不能 ...

随机推荐

  1. 网站静态化处理—web前端优化—上

    网站静态化处理—web前端优化—上(11) 网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是 ...

  2. 基于HTTP/2和protobuf的RPC框架:GRPC

    谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobu ...

  3. awk的实施例

    1.使用split功能 name.url内容: 上海    http://trip.elong.com/shanghai/jingdian elong   destination 云南    http ...

  4. nodejs开发aspnet5项目

    结合nodejs开发aspnet5项目 1.安装kvm   官方教程地址:https://github.com/ligershark/Kulture 打开 powershell命令窗口,找不到可以在开 ...

  5. 原生AJAX基础讲解及兼容处理

    原文:原生AJAX基础讲解及兼容处理 AJAX = Asynchronous JavaScript and XML (异步的JavaScript和XML). AJAX不是新技术 ,但却是热门的技术.它 ...

  6. jQuery 表格

    jQuery 表格插件汇总     本文搜集了大量 jQuery 表格插件,帮助 Web 设计者更好地驾御 HTML 表格,你可以对表格进行横向和竖向排序,设置固定表头,对表格进行搜索,对大表格进行分 ...

  7. C和Java中数组的定义

    在学习C和Java中,关于数组的定义两者不同,在初学的时候,容易产生混淆,现在将两者对比下. 1.初始化 在C语言中,关于一维数组的定义: 完全初始化  int a[5]={1,2,3,4,5},对于 ...

  8. Gimp插件Hello world注释

    前一阵翻译gimp官网的编写插件教程,本打算继续翻译第二部分,但是感觉第一个例子还不是很懂,翻译第二部分有点理解不能,所以就读了一下源码,记录如下 #include <libgimp/gimp. ...

  9. Asterisk 未来之路3.0_0003

    原文:Asterisk 未来之路3.0_0003 Asterisk: The Hacker's PBX 如果电信公司忽视了asterisk,那么正在处于危险中.asterisk 良好的扩展性,能够创建 ...

  10. [C++] 获取IE代理server的账号password

    非常多程序须要使用'浏览器设置'的代理server,IE设置的代理server有可能是须要账号password的.如何编程获取浏览器设置的代理server的账号password呢? InternetQ ...