//加载树
MainTreePanel = Ext.extend(QM.ui.AccordinTreePanel,{
constructor : function() {
MainTreePanel.superclass.constructor.call(this, {
region:'center',
xtype: 'accTree',
border:false,
frame:false,
//loadMask: {msg:'正在加载数据,请稍侯……'}, //加载数据时提示信息
root : 'menus',//必须要配
url: '...........' //地址
});
}
});
/**
AccordinTreePanel
* 扩展了Panel类,其布局设为accordion,所在区域为west;该组件初始化后会根据配置的url和root向后台发
* 起请求并解析返回的json串,根据parentcode为空的结点生成TreePanel,子节点通过parentcode属性添加为
* 对应结点的子节点,注意此处每个节点的code必须小于父节点并接大于下方的其它结点;
*
* 1.1更新:
* 1.不再需要leaf属性,程序内部判断;
* 2.store用完后即销毁,不再可用;
* 3.修改了结点点击的触发事件,仅注册一次以减少内存占用,该方法传递给监听函数一个Ext.tree.TreeNode对象,
* 可通过node.attributes属性获取结点属性;
* 4.添加了一个findNodeById方法,该方法通过id字符串返回对应Ext.tree.TreeNode对象;
*
*/
Ext.namespace("QM.ui");
QM.ui.AccordinTreePanel = Ext.extend(Ext.Panel, {
/**
* @cfg(url) 发送请求的地址
*/
/**
* @cfg(root) json数组的根字符串
*/
margins: '5 0 5 5',
split: true,
width: 220,
//frame: true,
initComponent: function(){
Ext.apply(this, {
layout: 'accordion',
region: 'center'
})
QM.ui.AccordinTreePanel.superclass.initComponent.call(this);
this.addEvents( /**
* @event itemclick 树结点被点击时触发 参数:node 当前结点对象,record 当前结点对应record对象
*/
'click', /**
* @event afterload 菜单项加载完毕后触发
*/
'afterload');
if (!this.store) {
this.store = new Ext.data.JsonStore({
url: this.url,
root: this.root,
fields: ['code', 'name', 'parentcode', 'iconCls', 'href']
});
}
this.store.load({
callback: this.loadTrees,
scope: this
});
},
loadTrees: function(records, o, s){
var pnodes,trees = [],tree;
this.store.sort('code');
for (var i = 0; i < records.length; i++) {
var record = records[i];
if (!record.get('parentcode')) { //为假时 加载父
tree = this.creatTreeConfig(record);
trees.push(tree);
pnodes = [];
pnodes.push(tree.root);
}
else {
var next_record = records[i + 1];
var isLeaf = !next_record || next_record.get('parentcode') != record.get('code');
this.addTreeNode(pnodes, record, isLeaf);
}
}
Ext.each(trees,function(tree){
this.add(tree);
},this);
this.fireEvent('afterload', this);
this.mon(this.el, 'click', this.onClick, this);
this.doLayout();
this.store.destroy();
},
findNodeById:function(id){
var node,trees = this.findByType('treepanel',true);
Ext.each(trees,function(tree){
node = tree.getNodeById(id);
return !node;//找到的话返回false
});
return node;
},
onClick: function(e, t, o){
if(Ext.fly(t).hasClass('x-tree-ec-icon')){//点击伸展按钮时无视
return;
}
var el,id,node;
if (el = e.getTarget('.x-tree-node-el', 3,true)) {
e.stopEvent();
id = el.getAttributeNS('ext','tree-node-id');
node = this.findNodeById(id);
this.fireEvent('click',node);
}
},
creatTreeConfig: function(record){
var config = {
xtype: 'treepanel',
autoScroll: true,
rootVisible: false,
title: record.get('name'),
iconCls: record.get('iconCls'),
root: {
nodeType: 'async',
expanded: true,
id: record.get('code'),
children: []
}
};
return config;
},
addTreeNode: function(pnodes, record, isLeaf){
var len = pnodes.length;
for (var i = len - 1; i >= 0; i--) {
if (pnodes[i].id != record.get('parentcode')) {
pnodes.pop();
}
else {
var parent = pnodes[i].children;
var node = {
text: record.get('name'),
id: record.get('code'),
iconCls: record.get('iconCls'),
href: record.get('href'),
leaf: isLeaf
};
if (!isLeaf) {
node.children = [];
pnodes.push(node);
}
parent.push(node);
return;
}
}
}
});
Ext.reg('accTree', QM.ui.AccordinTreePanel);
后台返回json格式:
{menus:[
{code:'20',href:'jsp/wordcase/index.jsp?cmoduleId=20',iconCls:'views_detail',name:'案例学习',parentcode:''},
{code:'21',href:'jsp/wordcase/index.jsp?cmoduleId=21',iconCls:'list-items',name:'文字案例查看',parentcode:'20'},
{code:'22',href:'jsp/seemedia/seeMidaIndex.jsp?cmoduleId=22',iconCls:'contact_user',name:'视频案例查看',parentcode:'20'}]}
- 大小: 6 KB
分享到:
相关推荐
在传统的网页开发中,如果一次性加载所有数据,可能会导致页面加载速度慢,用户体验下降。而动态异步加载(Asynchronous Loading)则是在用户滚动或交互时按需加载数据,降低了初始加载的时间,提升了性能。ExtJS的...
extjs4.0中,不想一次性加载所有的controller,特别是那种tabPanel布局的时候,一个tab的内容对应一个controller的时候。可以通过动态创建controller的方式,还能遵循mvc设计规范。这个例子完美破解,经过测试。 ...
动态加载树(Dynamic Loading Tree)是指在用户滚动或展开树节点时,仅加载当前需要显示的数据,而非一次性加载所有数据,这有助于提高页面性能和用户体验。 在描述中提到的博客链接可能提供了一个实现动态加载树的...
这种方式避免了一次性加载大量数据导致的性能问题,特别是当树型结构非常深或者包含大量节点时。 在 ExtJS Tree 中实现异步加载,主要涉及以下几个关键点: 1. **TreeStore**:存储树节点数据的模型,可以配置 `...
异步加载,也称为懒加载或需求加载,意味着当用户滚动、展开节点或者进行其他交互时,只加载当前需要的数据,而不是一次性加载整个树。这在处理大量数据或深层级结构时特别有用,因为它减少了初次加载时的网络传输量...
延时加载是一种数据加载策略,它不是一次性加载所有数据,而是只在用户需要时才加载部分数据。在GridPanel中,当用户滚动到表格的底部或顶部时,延时加载会自动请求更多的数据。这种方式降低了初始页面加载时间,...
在开发基于ExtJS框架的应用程序...通过以上方法,开发者可以在ExtJS中有效地管理Store的加载过程,提供良好的用户反馈机制,增强应用程序的交互性和可用性。这些技术细节对于构建高效、响应迅速的Web应用程序至关重要。
动态树加载,也称为懒加载或按需加载,是指在用户滚动、展开节点或执行其他操作时,只加载当前所需的树节点数据,而不是一次性加载所有数据。这种技术在处理大量数据或层级结构时尤其有效,因为它避免了前端一次性...
首先,动态加载菜单的概念是指菜单项不是在页面加载时一次性全部显示,而是根据用户的操作或特定条件按需加载。这种设计提高了应用的响应速度,降低了初始加载的资源需求,尤其是在菜单结构复杂或菜单项数量众多时。...
在实际项目中,结合`jq`库(可能是jQuery的简写),可以方便地处理DOM操作,与EXTJS的组件交互,进一步增强动态加载的效果,比如添加动态加载的动画、错误处理等。 总结来说,`Ext.Panel`和`TreePanel`在EXTJS中是...
动态加载意味着Grid的数据不是一次性全部加载到页面上,而是根据用户的滚动或分页请求按需加载。这通过使用Store组件的`load`方法和远程代理(如`JsonPStore`或`AjaxStore`)来实现。配置store时,可以设置`...
在大型数据集的情况下,一次性加载所有节点可能导致页面响应变慢。ExtJS TreePanel 支持按需加载,即只有当用户展开某个节点时,才会请求服务器获取该节点的子节点数据。这极大地优化了用户体验,减少了不必要的网络...
1. **代码懒加载**:在大型应用中,所有类一次性加载可能会导致页面加载速度变慢。通过ExtJS的动态加载机制,开发者可以定义哪些类是在需要时才加载的。例如,当用户访问特定功能时,系统才会加载相应的控制器、模型...
### Extjs动态加载树代码详解 #### 一、引言 在Web应用开发过程中,树形结构是非常常见的一种数据展示形式。它可以帮助用户更清晰地理解层级关系,并且便于进行多级导航。Extjs作为一款功能强大的前端框架,提供了...
6. **area.sql文件**:虽然给定的文件列表中有一个名为`area.sql`的文件,但这与ExtJS的Combox远程加载数据直接关联性不大。这个文件可能是数据库脚本,用于创建与Combox相关的数据表,但具体如何使用,取决于你的...
这个管理器允许在运行时根据需要加载特定的JavaScript文件,避免一次性加载所有脚本,从而提高应用程序的性能。 `import.js`可能是这个动态加载管理器的核心文件,负责处理加载逻辑。以下是一些可能包含在这个`...
demo描述: 1. 页面主框架是左是一个tree,右边是一个tablepanel 2. 左边的树是加载主页面的时候动态生成 3. 点击左边的树的节点动态加载...注:需要自己导入Extjs 4.2.x 的文件,该demo是用Extjs 4.2.1 写的
这种方式在处理大量数据时特别有效,因为它避免了一次性加载所有数据可能导致的性能问题和页面加载时间过长的问题。 在ExtJS Tree中实现动态加载,主要涉及以下几个关键概念: 1. **TreeStore**: TreeStore是ExtJS...
ExtJS的loading效果是指当数据正在后台加载或页面正在处理时,显示的一种视觉提示,告知用户系统正在进行工作。这通常是一个旋转的指示器或文字提示,如“正在加载...”。这种效果可以避免用户在等待过程中感到迷茫...
EXTJS是一个基于JavaScript的富客户端框架,它提供了丰富的组件库和数据管理模型,用于构建复杂的Web应用程序。`tabpanel`是其中的一个重要组件,它继承自`container`,可以容纳多个`panel`,每个`panel`对应一个...