动态载入数据的无刷新TreeView控件(7)

简介:
    上一次说了一下要支持无限级的动态加载TreeView控件,服务器端数据的准备情况。不过那只是一个小小的演示实例,在实际的使用中,服务器端的数据可能会完全的不同,不过不管怎么变化,也必须要保证能形成树形数据的request/response结构。

    由于TreeView必须在加载了节点信息有才能被Show出来,所以这里我们先手动把root level的节点生成。代码示例如下:
< script  Language ="javascript" > </ script >

    这里需要注意的是我们在此使用的是同步xmlhttp方式去获取的root level的数据,为什么这里不用异步呢?这是由我们的节点关系决定的,在 第一节里我就说过,这个TreeView的每一层,其实是一个独立的Tree,然后在节点TreeNode下挂接Tree,就形成无限级的结构了。而当我们在获取root level的数据时,还没有TreeNode这个东西。我们使用同步连接,可以保证原数据获取的顺序。当然在子节点的动态展开中,我们使用得是异步xmlhttp获取的数据。

    当我们在Expand一个TreeNode时,如果这个节点的IsLazyLoad属性是true,那么执行代码:
 TreeNode.prototype.LoadNodes =  function()
 {
     var childTree =  this.m_Element.nextSibling;
     childTree.style.display = 'inline';
      this.m_IsChildExpanded =  true;
     this.m_Element.OpIcon.src = TreeStyle.OpIcon( this.GetOpIconName());
     childTree.cells(1).innerHTML = '<img src="' + TreeStyle.OpIcon('BottomLine')
         + '" border="0" align="absMiddle"><span style="color:blue;">loading </span>';
     var url =  this.Attributes('Url') + '?NID=' +  this.m_ServerId
         + '&CID=' +  this.m_Id + '&t=' +  new Date().getTime();
     __XmlHttpPool__.GetRemoteData(url,  this.LoadingNodes);
 };

    在上面的调用中,url是类似如下的一个请求:
    http://localhost/TreeView/GetTreeNodes.aspx?NID=1&CID=__TreeObject__11&t=12349803

    NID是NodeId,CID是ClientId,t是一个时间戳(用来绕开IE的cache机制)。

    返回的数据,上次也都说过了,形如:
 __TreeObject__11$[
   ["2",    "DV作品",    "-1",    "Mar 22 10:28",    "2"],
   ["5",    "大陆",    "-1",    "Apr 2 02:01 ",    "9"],
   ["14",    "港台",    "-1",    "Apr 2 02:02 ",    "34"],
   ["63",    "欧美",    "-1",    "Apr 2 01:50 ",    "174"],
   ["80",    "日韩",    "-1",    "Apr 2 01:53 ",    "226"]]

    在我们的xmlhttp的回调函数中,我们主要做三件事情:
    1、找到本次返回数据的Parent Node,就是说这些数据是谁的子节点;
    2、根据返回的数据生成子树,然后把子树append到Parent Node上;
    3、更新Parent Node和Child Tree中的属性状态值,比如:m_ChildTree、m_ParentNode等。
    
    参考代码如下:
 TreeNode.prototype.LoadingNodes =  function(metadata)
 {
     try
    {
          var clientId = metadata.substring(0, metadata.indexOf('$'));
          var data = metadata.substring(metadata.indexOf('$')+1);
          var aryData = eval(data);
          var tree =  new Tree();
          for (  var i=0 ; i < aryData.length ; ++i )
         {
              //  ["1","Movie","-1","Mar 29 07:23", "1"],
              var aryNode = aryData[i];
              var node =  new TreeNode(aryNode[1]);
              if ( aryNode[0] != -1 )
             {
                  node.m_IsLazyLoad =  true;
             }
             node.m_ServerId = aryNode[4];
             tree.Add(node);
         }
          var objNode = __GlobalTreeCache__[clientId];
         objNode.m_ChildTree = tree; 
         objNode.m_Tree.ApplySingleton(); 
         objNode.m_IsLazyLoad =  false;
         tree.m_ParentNode = objNode;
          var childTree = objNode.m_Element.nextSibling;
          var childNode = childTree.cells(1);
         childNode.innerHTML = '';
         childNode.appendChild(tree.Render(childTree.document));
     }
      catch(e)
     {
         __Debug(e, metadata);
     }
 };

    // 在类似这样的callback函数中,一般是不会有this出现的,因为这是的this指代的是window。

    本来步骤2是比较麻烦的,但是由于我们在获取子节点的metadata时,同时把节点的Client ID也发到了服务器端。服务器返回时又将其原样返回了,所以我们只需要用这个Client ID,并且借助TreeView的全局Cache,很容易就能得到这个节点:var objNode = __GlobalTreeCache__[clientId];。

    使用这样一个子节点的装载方式,可以非常sexy的利用异步操作同时加载多个子节点数据(只要的鼠标点击足够快)。同时load多个子节点的效果如下图:

    TreeView-5.gif
    注:关于__XmlHttpPool__参看这里


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
缓存 数据库 索引
如何优化Python Web应用的性能,包括静态资源加载、缓存策略等?
```markdown 提升Python Web应用性能的关键点:压缩合并静态资源,使用CDN,设置缓存头;应用和HTTP缓存,ETag配合If-None-Match;优化数据库索引和查询,利用数据库缓存;性能分析优化代码,避免冗余计算,使用异步处理;选择合适Web服务器并调整参数;部署负载均衡器进行横向扩展。每一步都影响整体性能,需按需调整。 ```
268 4
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
813 0
|
数据可视化 PyTorch Serverless
Python 性能分析的几个方法,找到你代码中的那个她
我们在编写了一个脚本在笔记本上处理一些数据,然后去喝杯咖啡或者上了个厕所,15分钟后回来时发现进度才完成不到10%。 我们的脑袋里面就会发问:为什么这么慢?究竟是在哪个部分是慢的?是读取数据、处理数据还是保存数据?如何让它变快?它真的很慢吗? 有了这个疑问我们尝试去解决这个问题,下面我们介绍几个 python 性能分析的工具。
|
关系型数据库 MySQL Linux
Navicat 连接 Windows、Linux系统下的MySQL 各种错误,修改密码。
使用Navicat连接Windows和Linux系统下的MySQL时可能遇到的四种错误及其解决方法,包括错误代码2003、1045和2013,以及如何修改MySQL密码。
1450 0
|
弹性计算 监控 Devops
"揭秘!阿里云云效如何以戏剧性飞跃,重塑企业门户网站部署,一键解锁DevOps魔法,让您的网站秒变行业巨星!"
【8月更文挑战第8天】阿里云云效企业门户网站部署解决方案是一站式DevOps平台,集成云效Flow、Codeup、Testplan等,支持自动化构建、部署与测试。通过ECS实例等资源准备、云端代码托管、持续集成与部署、及全方位监控,实现网站高效稳定运行。采用YAML配置简化流程,确保快速迭代与优化,适用于各类企业的数字化转型。
340 3
|
缓存 NoSQL 网络安全
【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功
【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功
245 0
|
异构计算
振南技术干货集:CPU,你省省心吧!(2)
振南技术干货集:CPU,你省省心吧!(2)
|
数据挖掘 架构师
网站数据池里原来藏着这些后台数据逻辑
网站数据池里原来藏着这些后台数据逻辑
529 1
网站数据池里原来藏着这些后台数据逻辑
|
XML JavaScript Java
Java 中文官方教程 2022 版(四十)(1)
Java 中文官方教程 2022 版(四十)
132 0
|
前端开发 Java
Springboot 一个注解搞定返回参数key转换 【实用】
Springboot 一个注解搞定返回参数key转换 【实用】
608 0
Springboot 一个注解搞定返回参数key转换 【实用】