EXT Column Tree 的应用
一. 需求
考虑下表,有这样一些特点:
1. 考评表可能会根据年份或者地区的变化而有所不同,需要进行订制;
2. 考评表分为“考评项目”和“考评内容”两个层次的结构,当然每条“考核内容”里会有类如“检查方式”等属性;
如何来订制?感觉适合采用ColumnTree的形式来实现。
二. 最后效果
三. 实现过程
1. Editable ColumnTree 原型
找到一个Demo,基于Ext的插件 Editable Column Tree (学习Ext 一定要常到英文官网转转,经常有些好东西:)。
Demo 由五个文件构成:
-
editable-column-tree.js (核心文件,主要配置、操作都在这里)
-
editable-column-tree.html (展现页面,只是指定一个div,告诉 columnTree 在这渲染)
-
editable-column-tree.css (样式文件,没穿衣服是不好意思见人的)
-
ColumnNodeUI.js (节点UI,节点的展现方式,没有它就不一定叫**树了)
-
treeSerializer.js (序列化,可以把树或节点以Json或XML形式的String返回)
2. 动态数据
Demo 的数据是放在 editable-column-tree.js 文件中的几条 Json 数据,需要改成从数据库中获取。
var tree = new EXT.tree.ColumnTree( {
// ......
// 指定展现树的div容器
el : 'tree-ct',
// 根节点不显示
rootVisible : false,
width : 800,
autoHeight : true,
autoScroll : true,
expandable : false,
enableDD : true,
title : '编制模板',
// 定义一个根节点,id为1
root : new EXT.tree.AsyncTreeNode( {
"text" : "考核内容",
"id" : "1",
"allowDrag" : false
})
});
tree.on('beforeload', function(node) {
// 如果点击一个节点,加载前就去异步获取该节点下的数据,看~参数id是你点击的那个
if (node.id != '1') {
tree.loader.dataUrl = $('#tree-ct').attr("url") + '&id=' + node.id;
}
// 默认加载根节点,可以指定一个id,只要action根据此id获取到第一层节点数据即可
else {
tree.loader.dataUrl = $('#tree-ct').attr("url") + '&id=0';
}
});
div指定树的展现容器,同时可以在这定义action的url,好从后台取数据(如何获取数据并以Json串返回从略)
<table width="800">
<tr >
<td align="center">
<div id="tree-ct" url="***.do}" </div>
</td>
</tr>
</table>
3. CRUD操作
在tbar菜单里定义按钮,listeners会监听click事件,执行action的动作。
这里定义一个弹出页面进行新增的操作。需要带参数可以再页面中定义一个hidden变量,如下带了一个参数id。
text : '考核项目',
tooltip : '新增考核项目',
iconCls : 'folder-icon',
listeners : {
'click' : function() {
var href = "***Action_add.do?id=" + $('#id').val();
window.open(href, "", "height=550, width=800, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no");
}
}
新增考核内容需选定其所属的考核项目。
text : '考核内容',
tooltip : '新增考核内容',
iconCls : 'page-icon',
listeners : {
'click' : function() {
var selectedItem = tree.getSelectionModel().getSelectedNode();
if (!selectedItem || selectedItem.attributes.leaf == true) {
EXT.Msg.alert('提示框', '请选择考核项目.');
return false;
}
var href = "***Action_addChild.do?id=" + $('#id').val() + "&parentId=" + selectedItem.id;
window.open(href, "", "height=550, width=800, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no");
}
}
text : '修改',
tooltip : '修改',
iconCls : 'modify-icon',
listeners : {
'click' : function() {
var selectedItem = tree.getSelectionModel().getSelectedNode();
if (!selectedItem) {
EXT.Msg.alert('提示框', '请选择修改项.');
return false;
}
var href = "***Action_modify.do?id=" + selectedItem.id;
window.open(href, "", "height=550, width=800, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no");
}
}
text : '删除',
tooltip : '删除',
iconCls : 'delete-icon',
listeners : {
'click' : function() {
var selectedItem = tree.getSelectionModel().getSelectedNode();
if (!selectedItem) {
EXT.Msg.alert('提示框', '请选择删除项.');
return false;
}
if (selectedItem.attributes.leaf == true) {
EXT.MessageBox.confirm('确认框', '您确定要删除<b><font color=#ff0000>' + selectedItem.attributes.itemDesc + '</font></b>信息吗?', showResult);
} else {
EXT.MessageBox.confirm('提示框', '<b><font color=#ff0000>该项目下的所有子项也将一同删除!</font></b>', showResult);
}
function showResult(btn) {
if (btn == "yes") {
var href = "***Action_delete.do" + "?assessItemId=" + selectedItem.id;
$.post(href, null, function(msg) {
tree.root.reload();
tree.expandAll();
});
}
};
}
}
4. 刷新
新增、修改操作之后需要关闭弹出窗口、并对Column Tree 进行刷新, 在弹出窗口页面引入的js中加入这两行即可。
window.opener.location.reload(); //刷新父窗口
window.close(); //关闭当前窗口
5. 屏蔽双击默认操作
在树上双击节点查看详细信息
tree.on('dblclick', function(n) {
var selectedItem = tree.getSelectionModel().getSelectedNode();
var isLeaf = selectedItem.attributes.leaf;
var href = "***Action_view.do?id=" + selectedItem.id + "&isLeaf=" + isLeaf;
window.open(href, "", "height=550, width=800, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no");
});
如果点击非叶子节点,菜单还同时展开或者收起的动作,如何屏蔽掉呢?在 ColumnNodeUI 里面加上下面的代码。
// 屏蔽dblclick的折叠展开功能
EXT.override(BoxUI.tree.TreeNodeUI, {
onDblClick : function(e) {
e.preventDefault();
if (this.disabled) {
return;
}
if (this.checkbox) {
this.toggleCheck();
}
if (!this.animating && this.node.hasChildNodes()) {
var isExpand = this.node.ownerTree.doubleClickExpand;
if (isExpand) {
this.node.toggle();
};
}
this.fireEvent("dblclick", this.node, e);
}
});
分享到:
相关推荐
- 使用`Ext.tree.Column`可以为TreePanel添加列,展示更多节点信息。 - `Ext.menu.Menu`可以与`itemcontextmenu`事件结合,创建节点的右键菜单。 - `Ext.selection.TreeModel`提供了树形选择行为,支持单选或多选...
### Ext.ux.tree.TreeGrid 异步加载知识点详解 #### 一、Ext.ux.tree.TreeGrid简介 在ExtJS框架中,`Ext.ux.tree.TreeGrid`组件是一种结合了树形结构与表格显示特性的控件,适用于展示具有层级关系的数据。通过...
EXT JS是一个用于构建富互联网应用(RIA)的JavaScript库,它提供了大量的UI组件和数据绑定机制,支持响应式布局,适用于各种屏幕尺寸。EXT JS的组件化开发方式使得开发者可以构建复杂且交互丰富的界面。 2. **...
EXT.tree.Column用于设置树节点列的显示,EXT.tree.LoadMask可以在加载数据时显示遮罩。 4. **独立文件和注释**: 每个控件被编写为独立的文件,这意味着它们可以方便地被引入到项目中,降低了代码的耦合度,有利于...
要实现`editable-column-tree`,首先需要创建一个基本的`Ext.tree.Panel`实例,然后配置其`columns`属性来定义可编辑的列。每列可以通过设置`editor`属性来指定编辑器类型,例如`Ext.form.field.Text`、`Ext.form....
2. 定义表格列:使用Ext.grid.ColumnModel或者Ext.grid.column.Column定义列的配置,包括标题、宽度、数据绑定等。 3. 创建表格:使用Ext.grid.Panel或Ext.view.Table创建表格视图,并将其与数据源关联。 4. 配置...
开发者可以使用`Ext.tree.Column`来定义列,就像在普通的`Ext.grid.Panel`中一样。同时,还需要配置`store`来管理数据,这个store不仅需要支持树型结构,还需要支持表格数据的展示。通常,数据源会包含`children`...
4. **Tree**:EXT的树形组件用于展示层次结构的数据,支持动态加载、拖放操作和节点的展开/折叠。 5. **Tab Panel**:通过Tab Panel,可以创建带有多个标签页的应用界面,每个标签页可以包含不同的组件或面板。 6....
1. **布局管理**:EXT JS提供多种布局方式,如表单布局(Form Layout)、流式布局(Fluid Layout)、绝对布局(Absolute Layout)、列布局(Column Layout)等,这些布局在创建复杂的网页布局时非常有用。...
Ext3.4是一个基于JavaScript的前端开发框架,主要用于构建富客户端应用。这个“Ext3.4无限极tree grid demo”...通过阅读和分析这些文件,我们可以深入理解Ext3.4如何实现无限级Tree Grid,并将其应用到自己的项目中。
- Ext JS提供了大量的UI组件,如数据网格(datagrid)、选项卡面板(tabpanels)、树形控件(tree controls)等,极大地提升了开发效率。 3. **双向数据绑定:** - 双向数据绑定机制使得视图与模型之间的数据同步变得...
7.5.11 树节点:ext.data.nodeinterface与ext.data.tree / 364 7.5.12 store的方法 / 366 7.5.13 store的事件 / 368 7.5.14 store管理器:ext.data.storemanager / 369 7.6 综合实例 / 369 7.6.1 远程读取json...
2. **布局管理器**:Ext 3.0 提供了多种布局方式,如Fit布局、Form布局、Table布局、Column布局等,用于灵活地控制组件的排列和尺寸。 3. **数据绑定**:Ext 3.0 引入了数据绑定的概念,允许组件与数据源进行双向...
2. **EXT组件**:EXT提供了大量预定义的UI组件,如面板(Panel)、表格(Grid)、树形视图(Tree)、表单(Form)等。教程会详细介绍如何创建、配置和使用这些组件,以构建复杂的Web界面。 3. **布局管理器**:EXT...
1. **Tree**: EXTJS中的TreePanel是用于展示层次结构数据的组件,常用于文件系统或者组织架构的展示。它支持拖放操作、节点展开/折叠以及节点的动态加载。在树结构中,你可以定义节点文本、图标、叶子节点与父节点...
3. **布局(Layouts)**:布局管理器是Ext3.0中的重要组成部分,它们负责容器中子组件的排列和大小调整,如Fit布局、Column布局、Form布局等。 4. **数据绑定(Data Binding)**:Ext3.0支持数据驱动的编程模式,...
它提供了一系列预定义的UI组件,如表格(Grid)、树形视图(Tree)、面板(Panel)、窗口(Window)等,开发者可以方便地组合这些组件来构建复杂的用户界面。 2. **数据绑定**:ExtJS的数据绑定机制允许UI组件与...
3. **布局管理**:EXT提供了多种布局方式,如Fit、Border、Column等,学习如何根据界面需求选择合适的布局。 4. **事件处理**:掌握EXT的事件监听和触发机制,以及如何编写事件处理器函数。 5. **Ajax交互**:学习...
5. **高级功能**:涉及树形视图(Tree)、图表(Charts)、拖放(Drag & Drop)、Ajax请求(Ajax Request)等高级特性,帮助开发者构建更复杂的应用。 6. **性能优化**:分享最佳实践和技巧,以提高应用性能,如...
Ext 3.0 是一个基于JavaScript的开源框架,主要用于构建富客户端Web应用程序。这个框架以其强大的组件模型、数据绑定机制和丰富的用户界面组件而闻名。中文API文档是开发者理解和使用Ext 3.0的关键资源,它提供了...