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

简介: 这几天因为工作需要,要做一个支持无限级的菜单。 我也是菜鸟一只,能想到的东西不多,所以用了Easy UI的tree组件。 不得不说,easyui确实很强大。  因为是无限级菜单,数据量可能有点大,所以考虑采用异步加载。 但是因为后台默认传来的数据是 一个实体,所以又在后台进行了JSON字符串拼接。 最后,在网上找了N多代码,然后又去问了好几个群里的网友,终

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

我也是菜鸟一只,能想到的东西不多,所以用了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 + "&gt;&gt;" );
            }); 
复制代码

   其实,主要问题在于后台对数据的处理,即如何能够转化为 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} 找了半天,才知道问题所在。 第二种方式,就是我上面注释掉的那一行,直接使用字符串拼接。

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


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

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


    刚刚老大又发话了,让我把它给做成一组件。。在其他地方也可以调用的那种,我觉得目前的难题是:如何用JS把后台传来的 实体类型的 list转换成easyui tree可以识别的JSON数据? 不知道各位有没有什么好的办法,希望可以指点一下小弟,谢谢!
   PS:无限极菜单,群里有位网友说是 无限级也最大能支持 65535,不知道是不是这样子的,希望有高手能解答一下我的这个疑惑:无限极菜单到底能支持多少级?

目录
相关文章
|
2月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析:
|
2月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
2月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
3月前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
2月前
|
JSON 中间件 Java
【GoGin】(3)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
我们在正常注册中间件时,会打断原有的运行流程,但是你可以在中间件函数内部添加Next()方法,这样可以让原有的运行流程继续执行,当原有的运行流程结束后再回来执行中间件内部的内容。​ c.Writer.WriteHeaderNow()还会写入文本流中。可以看到使用next后,正常执行流程中并没有获得到中间件设置的值。接口还提供了一个可以修改ContentType的方法。判断了传入的状态码是否符合正确的状态码,并返回。在内部封装时,只是标注了不同的render类型。再看一下其他返回的类型;
163 3
|
2月前
|
JSON Java Go
【GoGin】(2)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将,以方便后续业务逻辑的处理。
271 3
|
3月前
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南
|
3月前
|
JSON 自然语言处理 监控
淘宝关键词搜索与商品详情API接口(JSON数据返回)
通过商品ID(num_iid)获取商品全量信息,包括SKU规格、库存、促销活动、卖家信息、详情页HTML等。
|
3月前
|
JSON 自然语言处理 API
多语言实时数据淘宝商品评论API:技术实现与JSON数据解析指南
淘宝商品评论多语言实时采集需结合官方API与后处理技术实现。建议优先通过地域站点适配获取本地化评论,辅以机器翻译完成多语言转换。在合规前提下,企业可构建多语言评论数据库,支撑全球化市场分析与产品优化。
|
3月前
|
机器学习/深度学习 JSON API
干货,淘宝拍立淘按图搜索,淘宝API(json数据返回)
淘宝拍立淘按图搜索API接口基于深度学习与计算机视觉技术,通过解析用户上传的商品图片,在淘宝商品库中实现毫秒级相似商品匹配,并以JSON格式返回商品标题、图片链接、价格、销量、相似度评分等详细信息。