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 ...
随机推荐
- ZigZag Conversion1
问题描述 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows ...
- poj 3181 Dollar Dayz
题意:给定一个数p,要求用K种币值分别为1,2,3...K的硬币组成p,问方案数,1,2,2和2,2,1算一种方案即与顺序无关,n <= 1000,k <= 100// 用完全背包做了 这 ...
- table中嵌套table,如何用jquery来控制奇偶行颜色
总是要趁着自己还有记忆的时候,把该记录下来的都记录下来,着实是不敢恭维自己的记性. 相信很多时候,我们前端人员,经常会用到table里面的某个td中还嵌套着table,而这个时候还总要去弄奇偶行的颜色 ...
- git中reset与revert的使用
http://alpha-blog.wanglianghome.org/2010/07/30/git-partial-rollback/ reset(版本撤回) 格式 git reset [-q] [ ...
- 《Python基础教程(第二版)》学习笔记 -> 第八章 异常
什么是异常 Python用 异常对象(exception object)来表示异常情况.遇到错误后,会引发异常,如果异常对象并未被处理或者捕捉,程序就会用所谓的回溯(Traceback,一种错误信息) ...
- 【转载】【内存对齐(二)】__declspec( align(#) )的用法和大小计算
转自:http://www.cppblog.com/deercoder/archive/2011/03/13/141747.html 感谢作者! 在上面讲到了关于pack的内存对齐和计算方法,这里继续 ...
- MorningSale 使用帮助
待添加 http://121.37.42.173:8080/morningsale
- 多校6 1003 HDU5795 A Simple Nim (sg函数)
思路:直接打表找sg函数的值,找规律,没有什么技巧 还想了很久的,把数当二进制看,再类讨二进制中1的个数是必胜或者必败状态.... 打表: // #pragma comment(linker, &qu ...
- 只有IE能上网,其他浏览器均不可以!
今天起来,高高兴兴的来到实验室,发现电脑打开上不了网.本人平时喜欢用Chrome,发现上不了网,就开始ping.发现可以ping通,但是网页打不开! 第一反应是DNS的问题,可以发现DNS没问题,能正 ...
- POJ-1002 解题报告
1.题目描述 http://poj.org/problem?id=1002 2.解题过程 按部就班来解题的话,这个题目很容易写出来,这是我的第一个版本的代码,思路是读入一行电话字符串,均转化为整型 ...