`
need_faith
  • 浏览: 82236 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【原创】TreePanel树形节点不收缩刷新

    博客分类:
  • Ext
阅读更多

遇到的问题

      在使用Ext树形组件的时候,下层节点的刷新,总是需要下层节点全部搜索然后再展开,如果需要实时的从后台获取数据,改变某些节点的text或者icon时,就显得不够优雅了。

 

解决方案

      负责树形组件TreePanle的TreeLoader是负责获取数据的,集成该类,然后在除第一次刷新之后的加载,将获取后的数据(比如节点的text、icon)更改到现有节点上,就可以很好的完成不收缩刷新

 

代码

/****************************************************
 * goal:为了让树的节点内容更新(目前包括text iconCls)
 * 而不让树形下层节点收缩带来的更好的用户体验
 * disadvantage:不能增删节点
 * createDate: 2009.09.24
 * author:	LXL
 *****************************************************/

Ext.namespace('SMN.ux.TreeLoader');


SMN.ux.TreeLoader = function(config) {
	config = config || {};
	SMN.ux.TreeLoader.prototype.processResponse = function(response, node, callback){
		var json = response.responseText;
		try {
            var o = response.responseData || Ext.util.JSON.decode(json);
			node.beginUpdate();
			var responseNodes = o;
			var treeNodes = node.childNodes;
			if (treeNodes.length == 0) {
				//	第一次加载
				for(var i = 0, len = responseNodes.length; i < len; i++){
	                var n = this.createNode(responseNodes[i]);
	                if(n){
	                    node.appendChild(n);
	                }
	            }
			} else {
				//	以后加载
				for (var i = 0; i < treeNodes.length; i++) {
					var treeNode = treeNodes[i];
					for (var j = 0; j < responseNodes.length; j++) {
						var responseNode = responseNodes[j];
						if (treeNode.attributes.id == responseNode.id) {
							//	同一个节点
							//	更新text
							treeNode.setText(responseNode.text);
							//	更新iconCls
							treeNode.getUI().getIconEl().className = 'x-tree-node-icon' + ' ' + responseNode.iconCls;
						}
					}
				}
			}
			node.endUpdate();
            if(typeof callback == "function"){
                callback(this, node);
            }
        }catch(e){
            this.handleFailure(response);
        }
	};
	SMN.ux.TreeLoader.prototype.load = function(node, callback){
//		Ext.log('into Ext.ux.TreeLoader.prototype.load');
		if(this.doPreload(node)){ // preloaded json children
            if(typeof callback == "function"){
                callback();
            }
        }else if(this.dataUrl||this.url){
            this.requestData(node, callback);
        }
	};
	SMN.ux.TreeLoader.superclass.constructor.call(this, config);
}
Ext.extend(SMN.ux.TreeLoader, Ext.tree.TreeLoader);

 缺点和解决方案

        当TreeLoader从后台获取的下层节点不再是目前的节点数量时,比如多了一个孩子节点或者少了一个孩子节点,以上代码是不能完成该功能的,所以可以增加if分支,从后台获取数据后,先比较下层孩子节点数据,遍历节点ID,将需要删除的孩子节点删除,多出来的孩子节点增加上,其他的更新text和icon。

 

注:本博客文章均已注明原创和转载,如转载本博客文章,需注明原文出处或征求原作者同意。

2
1
分享到:
评论

相关推荐

    Extjs4 treePanel节点刷新JS函数

    完美的Extjs4 treePanel节点刷新,函数为自动刷新选中的节点.API看得头疼才别出来的代码.截止我发之前,好像没有谁共享这个功能的函数吧.

    Ext TreePanel Checked Ext复选框树

    3. **TreeNode对象**:在`Ext JS`中,每个树节点都是一个`TreeNode`对象,它包含了节点的所有属性,如文本、图标、子节点等。对于复选框树,`TreeNode`还包含了复选框的状态信息。 4. **事件监听**:`TreePanel`...

    无废话ExtJs 系列教程十五[树:TreePanel]

    - **Nodes**:树形结构中的每一个元素称为节点,可以包含子节点。 - **Leaf Nodes**:没有子节点的节点称为叶节点,通常代表树结构的终端。 3. **配置项详解** - **store**:用于存储树结构数据的Store对象,...

    获取Extjs中的TreePanel中所有的被checked的叶子节点的id

    它可以包含多个节点(Node),每个节点又可以拥有子节点,形成一个树形结构。在实际应用中,经常需要对TreePanel中的节点进行操作,比如获取所有被选中的叶子节点的ID。 #### 2. 节点属性介绍 在TreePanel中,每个...

    TreePanel 带复选框的树

    这个"带复选框的树"是指在TreePanel中每个节点都带有可选中的复选框,用户可以通过这些复选框来选择或操作树形结构中的数据。这种设计通常用于权限管理、目录选择、层级关系配置等场景,使得用户能够直观地对多级...

    ExtJS5.0 树形菜单实例

    - `store`: 用于存储树节点数据的数据源。 - `root`: 树的根节点,通常设置为`{text: 'Root', expanded: true}`,表示初始展开状态。 - `displayField`: 显示节点文本的字段名。 - `foldersOnly`: 是否只显示有...

    ExtJS_TreePanel_树的配置详细属性

    主要方法: collapseAll():收缩所有树节点 expandAll():展开所有树节点 getRootNode():获取根节点 getNodeById(String id):获取指定id的节点 expand( [Boolean deep], [Boolean anim],

    easyui 树形结构样例

    2. 在`tree`的`data`属性中定义树形结构的数据,这些数据可以是JSON数组,其中每个对象表示一个树节点。 3. 配置`tree`的事件监听器,如`onLoadSuccess`、`onClick`等,以处理节点加载完成后的操作和用户的点击事件...

    ExtJS 3.4关于TreePanel的一些实例

    学习TreePanel时根据网上的资料自己实现的实例,结构如下: 1. 创建一棵树 ...11. 树形的拖放 12. 判断拖放目标 13. 树之间的拖放 14. 过滤器 15. 对树进行排序 16. 对树增加复选框 代码中有详尽的注释。

    多叉树结合JavaScript树形控件实现无限级树形结构(一种构建多级有序树形结构JSON(或XML)数据源的方法)

    2. Ext JS 框架:这是一种富客户端开发框架,其 TreePanel 组件常用于实现树形视图,支持 TreeNode 和 AsyncTreeNode,后者用于动态加载树节点。 3. 动态生成树节点:两种策略,一次性生成所有节点和逐级加载,前者...

    使用ExtJs构建树形菜单功能

    通过这种方式,可以实现更加灵活且高效的数据加载机制,使应用程序能够在不刷新整个页面的情况下更新树形菜单的内容。 #### 五、总结 本文详细介绍了如何使用ExtJs构建树形菜单,包括创建基础树形菜单、添加节点...

    Ext.net TreePanel的Checkbox操作及父子节点联动(修正)

    总结起来,EXT.NET TreePanel的Checkbox操作和父子节点联动是构建具有交互性树形结构的关键部分。通过正确的配置和事件处理,我们可以实现高效且用户友好的多选功能,而修正之前的Bug则确保了用户体验的一致性和正确...

    treepanel 和 tabpanel 完整

    `TreePanel`是Ext JS中的一个控件,它用于展示树形结构的数据。这种数据结构通常用于表示文件系统、组织架构或任何有层级关系的信息。`TreePanel`的主要特点包括: 1. **节点层次**:每个`TreePanel`都可以包含多个...

    ExtJs树形结构 ext的简单应用

    - **加载异步数据**:树节点的数据可以动态加载,当用户展开节点时,通过Ajax请求获取子节点数据。 - **自定义节点模板**:通过`viewConfig`中的`tpl`配置项,可以自定义节点的显示样式和内容。 7. **实际应用** ...

    JavaScript树形控件实现无限级树形菜单

    AsyncTreeNode允许我们通过AJAX技术从服务器获取数据并动态生成树节点。 #### 五、详细设计方案 1. **前端页面设计** - 文件一:`branchTree.html`,定义了树形控件的基本配置。 ```javascript Ext.onReady...

    Ext JS 深入浅出 树形结构

    在Ext JS中,树形结构由`Ext.tree.Panel`组件实现,它可以展示可折叠的节点,支持展开、折叠、添加、删除等操作。 **树形结构的节点实现:** 在Ext JS中,每个树形结构的节点都是一个`Ext.data.TreeNode`对象。节点...

    easyui或extjs构建动态树形结构

    在前端开发中,数据可视化是不可或缺的一部分,而树形结构作为一种常见的数据展现方式,被广泛应用于文件系统、组织架构、导航菜单等场景。EasyUI 和 ExtJS 都提供了强大的组件库来帮助开发者构建动态树形结构。这两...

    treePanel与gridPanel技术实现页面的增删改查

    - TreePanel是用来展示树形结构数据的组件,它可以显示节点的层次关系,并支持展开、折叠、拖放等交互操作。 - TreePanel的基础是`TreeStore`,它负责加载和管理树形数据。数据通常以JSON格式提供,包含节点ID、父...

    Ext TreePanel

    TreePanel提供了一种交互式的树形视图,用户可以通过展开、折叠节点来查看和操作数据。 在Ext JS中,TreePanel是基于Ext.grid.Panel扩展的,它包含了树形数据的渲染和操作功能。TreePanel可以与Ext.data.TreeStore...

    ext+dwr实现树形菜单源代码

    首先,EXT的TreePanel是实现树形菜单的基础组件。TreePanel提供了一种灵活的方式来展示层次结构的数据,并且支持各种交互操作,如展开/折叠节点、选择节点等。在EXT中,树形菜单的数据通常通过JSON格式从服务器获取...

Global site tag (gtag.js) - Google Analytics