Ext.data.TreeStore 分级异步加载树节点示例

本文介绍如何在ExtJS中实现树形结构的数据分级加载,通过客户端与服务器端的配合,展示了一种提高程序响应速度及用户体验的方法。具体包括数据模型定义、TreeStore配置、异步加载设置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ext.data.TreeStore远程加载树节点有两种常用方式,分别是:分级加载和整体加载。
对于结构复杂数据量大的树结构使用分级加载可以极大提高程序响应速度并提升用户体验。


客户端:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'treecolumn.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<link rel="stylesheet" type="text/css" href="resources/css/ext-all.css">
<script type="text/javascript" src="ext-all.js" ></script>
<script type="text/javascript" src="locale/ext-lang-zh_CN.js"></script>
<script type="text/javascript">
Ext.onReady(function(){
//定义数据模型
Ext.regModel("OrgInfo",{
fields:['orgId','name','count']
});
var myStore=new Ext.data.TreeStore({
model:'OrgInfo',
nodeParam:'orgId', //节点参数名
proxy:{
type:'ajax',
url:'treestore/treeServer.jsp',
reader:'json'
},
autoLoad:true,
root:{
name:'根节点',
[color=red] expanded : true,//根节点是否展开[/color]
id:'-1'
}
});
Ext.create('Ext.tree.Panel',{
title:'分级异步加载树节点示例',
renderTo:Ext.getBody(),
width:250,
height:200,
columns:[{
xtype:'treecolumn', //树状表格列
text:'公司名称',
dataIndex:'name',
width:150,
sortable:true
},
{
text:'员工人数',
dataIndex:'count',
flex:1,
sortable:true
}],
store:myStore,
rootVisible:false //,隐藏根节点
[color=red] //useArrows:true [/color]
});
});
</script>
</head>

<body>

</body>
</html>

服务器端:treeServer.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String orgId=request.getParameter("orgId");
String result="";
if("-1".equals(orgId)){
result="[{name:'总公司',count:100,id:100}]";
}else if("100".equals(orgId)){
result="[{name:'分公司一',count:20,id:110},{name:'分公司二',count:80,id:120}]";
}else if("120".equals(orgId)){
result="[{name:'部门一',count:30,id:121,leaf:true},{name:'部门二',count:50,id:122,leaf:true}]";
}
response.getWriter().write(result);
%>

注:所有示例来自《ExtJS Web 应用程序开发指南》第2版
这是第13章,开始没有得到想要的效果。后来问了其他朋友才知道少了
expanded : true,这行代码,没有默认展开根节点。

如果加上 useArrows:true 在树节点中使用箭头 ,效果如图usearrow.jpg
### Ext.js 中树节点的数据操作 #### 创建树结构并初始化 为了实现树形控件中的增删改查功能,首先要确保已经正确引入了 `Ext.tree.*` 组件库,并定义好基础配置项来构建一棵树。 ```javascript // 定义模型类 Ext.define('Task', { extend: 'Ext.data.Model', fields: ['id', 'text', 'leaf'] }); var store = Ext.create('Ext.data.TreeStore', { model: 'Task' }); ``` #### 添加新节点 向指定父级节点下追加子项目可以通过调用 `.appendChild()` 方法完成。此过程涉及创建一个新的记录实例作为待插入的对象[^1]。 ```javascript function addTreeNode(parentNode, newNodeData) { var nodeRecord = Ext.create('Task', newNodeData); parentNode.appendChild(nodeRecord); } ``` #### 删除现有节点 移除某个特定节点并不意味着立即销毁它;而是将其状态设置为不可见或者逻辑上已删除的状态。这通常通过更新该节点的相关属性(如 `status` 字段),而不是物理地从数据库中彻底清除数据。 ```javascript function markDeleteTreeNode(targetNode) { targetNode.set({ status: 1, text: "(Deleted)" + targetNode.get('text') }); } ``` #### 修改已有节点的信息 更改节点的内容可通过直接修改其字段值的方式达成。对于文本显示部分,则需调整对应的文字描述。 ```javascript function editTreeNode(targetNode, newText) { targetNode.set('text', newText); } ``` #### 查询获取节点列表 遍历整个树状图或是仅限于某一分支下的所有成员可以借助递归函数轻松处理。这里提供了一个简单的例子用于收集所有的叶子结点。 ```javascript function gatherLeafNodes(rootNode, collectorArray=[]) { rootNode.eachChild(function(child){ if (child.isLeaf()){ collectorArray.push(child); } else { gatherLeafNodes(child, collectorArray); } }, this); return collectorArray; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值