jquery使用EasyUI Tree异步加载JSON数据(生成树)


Posted in Javascript onFebruary 11, 2017

这几天因为工作需要,要做一个支持无限级的菜单。

我也是菜鸟一只,能想到的东西不多,所以用了Easy UI的tree组件。

不得不说,easyui确实很强大。

因为是无限级菜单,数据量可能有点大,所以考虑采用异步加载。

但是因为后台默认传来的数据是 一个实体,所以又在后台进行了JSON字符串拼接。

最后,在网上找了N多代码,然后又去问了好几个群里的网友,终于搞出来这个小东西。

一、HTML部分代码

<div id="categoryChooseDiv" title="请选择分类"
      style="width: 650px; height: 300px;">
       <ul id="MyTree"></ul>
  </div>

html部分很简单,只要放一个ul就可以了。

二、JS部分代码

function showCategory(){
      $('#MyTree').tree({  
         checkbox: false,  
         url: '/category/getCategorys.java?Id=0',  
         onBeforeExpand:function(node,param){ 
           $('#MyTree').tree('options').url = "/category/getCategorys.java?Id=" + node.id;
         },        
        onClick:function(node){
          var state=node.state;
           if(!state){                  //判断当前选中的节点是否为根节点
             currentId=node.id;
            $("#chooseOk").attr( "disabled" , false );  //如果为根节点 则OK按钮可用
            }else{
            $("#chooseOk").attr( "disabled" , true );  //如果不为根节点 则OK按钮不可用
            }
          } 
      });
  }

最后几句代码是因为我这个项目需要,只有选择到最下级节点的时候,才运行点击“确定”。否则不允许。
当用户点击确定的时候,需要获取 当前用户选中节点 的所有父节点

var nodes=[];      //定义数组用来存放各个节点名称
      var node =$("#MyTree").tree("getSelected"); //当前选中节点
      nodes.push(node.text);            //首先放入当前节点
      var pnode = $('#MyTree').tree('getParent',node.target); //获取当前节点的父节点
      while(pnode!=null){
        nodes.push(pnode.text);          //依次放入各个父节点,直到根节点为止
        pnode = $('#MyTree').tree('getParent',pnode.target);
      }
      nodes.reverse();             //数组元素倒序排序
      $.each(nodes,function(){        //循环取值
        var html=this;
          $("#inCategoryDiv").html( $("#inCategoryDiv").html() + html + ">>" );
      });

其实,主要问题在于后台对数据的处理,即如何能够转化为 easyui tree才可以识别的JSON数据。

三、后台代码(Java)

public ResponseEntity<String> findBy(Integer Id ) {
    List<Category> categorys = getcategorys(Id );
    String ss="";
    ss+="[";
    for( Category category : categorys )
       {
       ss+="{";
       //ss += "\"id\": \""+category.getId()+"\",\"text\": \""+category.getName().toString()+"\",\"iconCls\": \"icon-ok\",\"state\": \"closed\"";;
       List<Category> cs = getcategorys( category.getId() );  //判断当前节点是否还有子节点
       if(cs.size()==0){ //没有子节点 设置 state 为空
       ss+=String.format("\"id\": \"%s\", \"text\": \"%s\", \"iconCls\": \"\", \"state\": \"\"", category.getId() , category.getName());
       }else{    // 还有子节点 设置 state为closed
       ss+=String.format("\"id\": \"%s\", \"text\": \"%s\", \"iconCls\": \"\", \"state\": \"closed\"", category.getId() , category.getName());
      }
       ss+="},";
       }
       ss=ss.substring(0, ss.length() - 1); 
       ss+="]";
      return super.responseString(ss); //字符编码转换
    }

大致一个流程就是前台传来ID,然后获取到实体对象,然后对实体进行循环,然后进行字符串处理这里设置state的意义主要在于让 easyui 的tree可以知道当前节点是否为最低级节点,然后在前面显示不同的图标。

总结:

就是这个小东西,折腾了我好几天,呵呵,因为俺太笨了。不过还好最后搞懂了,也理解了很多东西。

以前一直觉得JSON这东西很神秘,现在觉得它还是有规律的。

使用easyui tree的重点之一,就是对JSON数据的处理,有两种方式可以实现:第一就是使用String的format方法。这个大家可以去网上参考一下相关的API等等,我第一次写错了,字符串的占位符应该是 %s  我写成了 {0} 找了半天,才知道问题所在。 第二种方式,就是我上面注释掉的那一行,直接使用字符串拼接。

然后上面获取当前节点的所有父节点的时候,又纠结了半天,去网上找了很多代码,都不能用,最后还是自己想了一招,才得以解决。

优点:可以使用异步加载,支持无限级。

缺点:太繁琐,对后台的数据格式要求过高。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
javascript中的对象创建 实例附注释
Feb 08 Javascript
JS 实现导航栏悬停效果(续2)
Sep 24 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
May 08 Javascript
Javascript堆排序算法详解
Dec 03 Javascript
jquery解决客户端跨域访问问题
Jan 06 Javascript
jQuery 回调函数(callback)的使用和基础
Feb 26 Javascript
readonly和disabled属性的区别
Jul 26 Javascript
js实现动态增加文件域表单功能
Oct 22 Javascript
微信小程序云开发之新手环境配置
May 16 Javascript
vux-scroller实现移动端上拉加载功能过程解析
Oct 08 Javascript
适合后台管理系统开发的12个前端框架(小结)
Jun 29 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
Feb 11 #Javascript
JavaScript实现瀑布流以及加载效果
Feb 11 #Javascript
JavaScript表单验证的两种实现方法
Feb 11 #Javascript
jQuery实现复制到粘贴板功能
Feb 11 #Javascript
js实现PC端和移动端刮卡效果
Mar 27 #Javascript
js实现短信发送倒计时功能(正则验证)
Feb 10 #Javascript
BootStrap select2 动态改变值的方法
Feb 10 #Javascript
You might like
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
PHP输出时间差函数代码
2013/01/28 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
进一步探究Python中的正则表达式
2015/04/28 Python
json跨域调用python的方法详解
2017/01/11 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
怎样自定义一个异常类
2016/09/27 面试题
房地产推广策划方案
2014/05/19 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
法定代表人资格证明书
2015/06/18 职场文书
2016年教师节慰问信
2015/12/01 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
Java实现注册登录跳转
2022/06/16 Java/Android