Ext.tree.Panel Extjs 在表格中添加树结构,并实现节点移动功能
最近在用Extjs 做后台管理系统,真的非常好用。总结的东西分享一下。
先展示一下效果图

好了,开始吧!
首先说一下我的创建结构:

一、构造内容
这个函数中包括store的创建,treePanel的创建
一个treePanel必须绑定一个Ext.data.TreeStore.
function constructor(config){
//创建一个treeStore 数据(我的用ajax取的,你们随意~)
var store = Ext.create('Ext.data.TreeStore', {
proxy: {
type: 'ajax',
url: 'http://localhost/data/aa.txt',
reader: {
type: "json",
rootProperty: "children",
transform: function (data) {
if (data.code === 1) console.log("error");
return data;
}
}
},
folderSort: true
});
// 创建treePanel了
var $tree = Ext.create('Ext.tree.Panel', {
width: '100%',
height: 600,
store: store,
useArrows: true,
rootVisible: false,
multiSelect: true, // 多选
//singleExpand: true, //单展开
autoScroll: true, // 自动滚屏
columns: [{ // 列项
xtype: 'treecolumn',
text: '菜单名称',
width: 250,
sortable: true,
menuDisabled: true,
dataIndex: 'text'
},{
text: '节点类型',
width: 150,
dataIndex: 'user',
menuDisabled: true,
align: 'center',
sortable: true
},{
text: '新增',
width: 70,
align: 'center',
menuDisabled: true,
renderer: function (value, metaData) {
return "<a href='#" + Math.random() + "'>新增</a>";
}
},{
text: '修改',
width: 100,
menuDisabled: true,
xtype: 'actioncolumn',
align: 'center',
icon: '/images/edit.png'
}, {
xtype: 'actioncolumn',
text: '删除',
width: 100,
menuDisabled: true,
align: 'center',
icon: '/images/delete.png',
handler: function(grid, rowIndex,colIndex,record) {
var rec = store.getAt(rowIndex);
if(rec.get('children') === null){
Ext.MessageBox.confirm(
"删除"
,"确定删除吗?"
,function( button,text ){
if( button == 'yes'){
rec.remove();
}
}
);
}else{
Ext.MessageBox.alert("删除","当前元素含有子节点,不能被删除");
}
}
}, {
text: '上移',
width: 50,
menuDisabled: true,
align: 'center',
renderer:function(value, cellmeta, record, rowIndex, columnIndex, store){
return "<a href='#" + Math.random() + "'>上移</a>";
}
},{
text: '下移',
width: 50,
menuDisabled: true,
align: 'center',
renderer:function(value, cellmeta, record, rowIndex, columnIndex, store){
return "<a href='#" + Math.random() + "'>下移</a>";
}
},{
text: '升级',
width: 50,
menuDisabled: true,
align: 'center',
renderer:function(value, cellmeta, record, rowIndex, columnIndex, store){
return "<a href='#" + Math.random() + "'>升级</a>";
}
},{
text: '降级',
width: 50,
menuDisabled: true,
align: 'center',
renderer:function(value, cellmeta, record, rowIndex, columnIndex, store){
return "<a href='#" + Math.random() + "'>降级</a>";
}
}],
listeners:{ //监听事件
cellclick: function (view, td, cellIndex, record, tr, rowIndex, e, eOpts){ // 单元格点击,贼好用
//判断点击的第几列(索引从0开始)
if(cellIndex === 2) return display$WindowAddNode(rowIndex,record, store);
if(cellIndex === 5) return moveEvent(rowIndex,record,store);
if(cellIndex === 6) return downEvent(rowIndex,record, store);
if(cellIndex === 7) return upgradeEvent(rowIndex,record, store);
if(cellIndex === 8) return downgradeEvent(rowIndex,record, store);
}
}
});
config.parent.add($tree);
return $tree;
}
面板创建完了,下面该实现功能了。
二、新增节点
看图说话。

在行内点击新增,只会作用到当前行。
//增加节点
function display$WindowAddNode(rowIndex,record,store){ //创建单选框
var $radioAdd = Ext.create('Ext.form.RadioGroup',{
xtype: 'radiogroup',
defaultType: 'radiofield',
layout: 'vbox',
margin: '10 0 0 20',
items: [
{
boxLabel : '增加子节点',
name : 'addNode',
inputValue:'childNode'
}, {
boxLabel : '在该节点前新增节点',
name : 'addNode',
inputValue:'frontNode'
}, {
boxLabel : '在该节点后新增节点',
name : 'addNode',
inputValue:'afterNode'
}
]
}); //创建面板 单选框 -输入框
var form = Ext.create('Ext.form.Panel', {
layout: 'absolute',
defaultType: 'textfield',
border: false,
defaults: {
anchor: '90%',
labelStyle: 'padding-left:4px;'
},
fieldDefaults: {
labelAlign: "right",
labelWidth: 70
},
items: [$radioAdd,{
id:'inputNode',
fieldLabel: '输入标题',
fieldWidth: 80,
margin: '110 0 0 0'
}]
}); //创建窗口
var win = Ext.create('Ext.window.Window', {
title: '增加节点',
width: 300,
height: 230,
layout: 'fit',
plain: true,
items: form,
buttons: [{
text: '确定',
handler:function(){
return addNodeYes();
}
}, {
text: '取消',
handler : function(){
win.close();
}
}]
}); win.show(); //确定增加节点
function addNodeYes(){ //获得单选钮的选项
var radioText = $radioAdd.getValue(); //输入框内容
var inputNode = Ext.getCmp('inputNode').getValue(); //新节点
var newNode={
text:inputNode,
duration:6.5,
user:'Tommy Maintz',
leaf:true,
iconCls:'text'
}; //当前节点父节点
var parentNode = record.parentNode; //判断 单选钮是否选中
if(inputNode !== ''){
if(radioText.addNode === 'childNode'){
record.appendChild(newNode);
win.close();
}else if(radioText.addNode === 'frontNode'){
parentNode.insertBefore(newNode,record);
win.close();
}else if(radioText.addNode === 'afterNode'){
for(var i = 0; i < parentNode.childNodes.length; i++){
if(parentNode.childNodes[i] === record){
parentNode.insertBefore(newNode,parentNode.childNodes[i+1]);
}
}
win.close();
}
}else{
alert('请输入标题');
} } }
三、上移功能也是作用当前行的
这个没图,不用找了,直接上代码
//上移
function moveEvent(rowIndex,record,store){ //当前节点父节点
var parentNode = record.parentNode;
var length = parentNode.childNodes.length;
var currentIndex = 0; //获取当前节点
for(var i =0; i < length; i++){
if(parentNode.childNodes[i] === record){
currentIndex = i;
}
} //操作
if(currentIndex <=0){
currentIndex = 1;
}else{
currentIndex = currentIndex - 1;
} parentNode.insertChild(currentIndex,record); }
四、下移
//下移
function downEvent(rowIndex,record,store){ //当前节点父节点
var parentNode = record.parentNode;
var length = parentNode.childNodes.length;
var currentIndex= 0; // 获取当前节点的索引
for(var i = 0; i < length; i++){
if(parentNode.childNodes[i] === record){
currentIndex = i;
}
} // 计算移除当前节点后,插入的目标节点索引
var targetIndex = (currentIndex>=(length-2))? (length-1) : currentIndex+1; // 删除当前节点
parentNode.childNodes[currentIndex].remove(); // 插入当前节点,至计算的目标位置
parentNode.insertChild(targetIndex,record); }
五、升级
//升级
function upgradeEvent(rowIndex,record,store){ //当前节点父节点的父节点
var parentPNode = record.parentNode.parentNode; parentPNode.appendChild(record); }
六、降级
//降级
function downgradeEvent(rowIndex,record,store){ //当前节点父节点
var parentNode = record.parentNode; for(var i = 0; i < parentNode.childNodes.length; i++){
if(parentNode.childNodes[i] === record){
parentNode.childNodes[i-1].appendChild(record);
}
} }
Srong前端小白:自己写的东西,写的不知道是否清楚,不一定都对,欢迎指正⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
最后,赠送一个福利:
modal:true //只可操作当前窗口,在弹出窗口中必不可少的属性
Ext.tree.Panel Extjs 在表格中添加树结构,并实现节点移动功能的更多相关文章
- Extjs学习笔记--Ext.tree.Panel
Ext.create('Ext.tree.Panel', { title: 'Simple Tree', width: 200, height: 150, store: store, rootVisi ...
- Extjs4.x Ext.tree.Panel 过滤Filter以及trigger field的使用
Extjs4.x中已经取消了组件Ext.Tree.TreeFilter功能,却掉了树形结构的过滤功能,要实现该功能只能自己写了. Tree节点筛选UI很简单,一个Tbar,一个trigger即可解决问 ...
- Ext.tree.Panel实现单选,多选
Extjs var productCategoryTreeLookUpFn = function(callback) { var productCategoryLookUpWindow; var pr ...
- ajax异步获取数据后动态向表格中添加数据(行)
因为某些原因,项目中突然需要做自己做个ajax异步获取数据后动态向表格中添加数据的页面,网上找了半天都没有 看到现成的,决定自己写个例子 1.HTML页面 <!doctype html> ...
- js如何实现动态的在表格中添加和删除行?(两种方法)
js如何实现动态的在表格中添加和删除行?(两种方法) 一.总结 1.table元素有属性和一些方法(js使用) 方法一:添加可通过在table的innerHTML属性中添加tr和td来实现 tab.i ...
- js如何实现动态在表格中添加标题和去掉标题?
js如何实现动态在表格中添加标题和去掉标题? 一.总结 1.通过table标签的createCaption(),deleteCaption()方法实现. document.getElementById ...
- ag-grid 表格中添加图片
ag-grid是一种非常好用的表格,网上搜索会有各种各样的基本用法,不过对于在ag-grid 表格中添加图片我没有找到方法,看了官方的文档,当然英文的自己也是靠网页翻译,最后发现有这么一个例子,我知道 ...
- iview+vue 表格中添加图片
开门见山,话不多说,要在表格中添加图片,可以使用td: <table " width="100%"> <tr class="tr-style ...
- 向CDH5集群中添加新的主机节点
向CDH5集群中添加新的主机节点 步骤一:首先得在新的主机环境中安装JDK,关闭防火墙.修改selinux.NTP时钟与主机同步.修改hosts.与主机配置ssh免密码登录.保证安装好了perl和py ...
随机推荐
- qq互联(connect.qq.com)取用户信息的方法
<?php //应用的APPID$app_id = "YOUR_APP_ID";//应用的APPKEY$app_secret = "YOUR_APP_KEY&quo ...
- noip2000提高组题解
事实再次向我证明了RP的重要性... 第一题:进制转换 是我最没有把握AC的一道题目却是我唯一一道AC的题目,真是讽刺.看完题目几乎完全没有往正常的解法(取余倒序)去想,直接写了搜索,因为数据范围在2 ...
- ffmpeg 从内存中读取数据(或将数据输出到内存)
更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...
- 【DFS+堆的二叉树结构】15轻院校赛-J-堆
[题目链接:J-堆] 1734: 堆 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 239 Solved: 113 SubmitStatusWeb B ...
- hihoCoder 1385 A Simple Job
#1385 : A Simple Job 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Institute of Computational Linguistics (I ...
- [Papers]NSE, $u_3$, Lebesgue space [NNP, QM, 2002; Zhou, JMPA, 2005]
$$\bex u_3\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=\frac{1}{2},\quad 6< q\leq \inft ...
- MyBatis 入门到精通(二) SQL语句映射XML文件
MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在.对于它的强大功能,SQL 映射文件的配置却非常简单. 如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射 ...
- 【剑指offer 面试题13】在 O(1) 时间删除链表结点
#include <iostream> using namespace std; //构造链表结点 struct ListNode { int val; ListNode *next; L ...
- DOS功能的调用
DOS功能的调用:主要包含三方面的子程序:设备驱动(基本I/O),文件管理和其他(包括内存管理,自取时间,自取终端向量,总之程序等)随着DOS版本的升级,这种DOS功能调用的子程序数量也在不断的增加, ...
- Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF
在实时渲染中Physically-Based Rendering(PBR)中文为基于物理的渲染它能为渲染的物体带来更真实的效果,而且能量守恒 稍微解释一下字母的意思,为对后文的理解有帮助,从右到左L为 ...