zTree的使用,向后台传值和获取值选中

    

首先引入zTree的css和js

html:

<div class="row">
                    <label class="col-sm-4 control-label"
                           style="text-align: right; margin-top:5px;padding-left: 10px;padding-right: 10px">选择产品:</label>
                    <div class="formControls col-xs-8 col-sm-7">
                        <ul id="funcTree" class="ztree"></ul>
                    </div>
                </div>

js配置:

获取数据:

var node="";
    $.ajax({
        url: "/it/orderManage/getLevelPackageTrain",
        dataType: "json",
        async: false,
        data: {
            "T_PACKAGE_CODE": $("#T_PACKAGE_CODE").val(),
        },
        type: "POST",
        success: function (ret) {
            node=JSON.stringify(ret);
        },
        error: function () {
        }
    });

返回的数据形式:要有自己的id和其父id,名字

配置ztree

简单示例:

funcSetting= {
    async:{
        enable:true,
        url:"${ctx}/serviceOrder/getServiceUserList",
        otherParam:{//传入查询参数
            //注意,要传入动态变化的参数必须用return的方式
            "regionGroupId":function(){return $("#regionGroupId").val()
            }
        },
    },
    view: {
        dblClickExpand: false,//禁止双击展开
        showLine: true, 
        selectedMulti: false
    },
    data: {
        key:{
            name:"NAME"//显示的名字
        },
        simpleData: {
            enable:true,
            idKey: "ID", //id
            pIdKey: "PID" //父id
        }
    },
    check:{
        enable:true,
        //chkboxType:{ "Y": "ps", "N": "s" }
        chkStyle: "radio", //选择框,可以是check或者radio
        radioType:"all" //all为全部树状中选择,level为自己一个根节点中选择
    },
    callback: {//回调函数
        onClick:function(event, treeId, treeNode){//点击每个节点回调
            

        },
        onAsyncSuccess:function(event, treeId, treeNode, msg) {//树结构加载完后回调
            
        }
    }
};
funcTreeObj = $.fn.zTree.init($("#funcTree"), funcSetting, null);  //初始化ztree

补充:

0.ztree里面用到的api和配置看这个手册,非常全面

http://www.treejs.cn/v3/api.php

1.查询传入参数用 otherParam,并用return返回

2.刷新树结构时:

funcTreeObj.reAsyncChildNodes(null, "refresh");

这种方法可以让ztree重新发送请求并刷新树结构

3.实现单击展开子节点方法(onClick回调方法中实现)

onClick:function(event, treeId, treeNode){
    funcTreeObj.expandNode(treeNode)//单击节点展开其子节点
    if(treeNode.level==1){ //点击子节点后记录其参数值
        $("#userId").val(treeNode.ID)
    }
},

4. 树加载完展开某节点

onAsyncSuccess:function(event, treeId, treeNode, msg) {
   // funcTreeObj.expandAll(true);//展开所有节点
   //默认打开顶级(第一级)节点
    var treeObj = $.fn.zTree.getZTreeObj(treeId);

      var nodes = treeObj.getNodes();

         if (nodes.length>0) {

          for(var i=0;i<nodes.length;i++){

          treeObj.expandNode(nodes[i], true, false, false);//默认展开第一级节点

          }

      }

}

5.实现只显示有子节点的根节点

onAsyncSuccess:function(event, treeId, treeNode, msg) {
    var nodes = funcTreeObj.getNodes();//默认只能得到根节点
    var ll=nodes.length;
    //因为循环过程会删除节点导致节点数量变化,所以使用双循环方法
    for (var i=0;i<ll;i++)
    {
        //删除选中的节点
        var l=funcTreeObj.getNodes().length;
        for(var j=0;j<l;j++){
            if(!nodes[j].isParent){//判断根节点是否有子节点,有isParent为true,没有子节点为false
                //console.log(nodes[j])
                funcTreeObj.removeNode(nodes[j]);//删除子节点
                break;
            }
        }
    }
}

 6.编辑时根据后台传来的数据使ztree选中

var node="";
    $.ajax({
        url: "/it/orderManage/getLevelPackageTrain",
        dataType: "json",
        async: false,
        data: {
            "T_PACKAGE_CODE": $("#T_PACKAGE_CODE").val(),
        },
        type: "POST",
        success: function (ret) {
            node=JSON.stringify(ret);
        },
        error: function () {
        }
    });
var funcSetting = {
        async:{
            enable:true,
            dataType:"json",
            url:"/it/orderManage/getTrainList1?level="+$("#level").val()+"" , //异步获取数据
            otherParam:{//查询数据时传入参数
                    //注意,要传入动态变化的参数必须用return的方式,否则只能接收初始值
                    "regionGroupId":function(){return $("#regionGroupId").val()
                    }
                },
        },
        view: {
            dblClickExpand: false,
            showLine: true,
            selectedMulti: false
        },
        data: {
            key:{
                name:"TITLE"    //显示返回数据的名字
            },
            simpleData: {
                enable:true,
                idKey: "TID",   //id
                pIdKey: "PID",    //父id
                rootPID:0     //根id
            }
        },
        check:{
            enable:true,
            chkboxType:{ "Y": "ps", "N": "s" }
        },
        callback: {
            onAsyncSuccess:function(event, treeId, treeNode, msg) {//数据获取成功后执行
                funcTreeObj.expandAll(true);  //设置所有为展开状态
                //使范户籍数据存在id的有选中状态
                var allNodes = funcTreeObj.getNodesByFilter(function(onenode){//这是一个自循环函数,会自动将所有节点遍历一遍,返回符合条件的节点数组
                    return (node.indexOf(onenode.TID) != -1);   //node为后台传来的值字符串,如果节点中的id存在我传的值,则把该节点选出
                });
                //循环选出的需要选中的节点
                for(var i=0; i<allNodes.length; i++) {
                    funcTreeObj.checkNode(allNodes[i], true, false);  //传入节点,使其选中
                }
            }                                                                                                                                                
        }
    };
     funcTreeObj = $.fn.zTree.init($("#funcTree"), funcSetting, null);  //初始化ztree

js提交时向后台传选中项的值:

var checkedObjs = funcTreeObj.getCheckedNodes(true);  //获取所有选中的节点
    if(checkedObjs.length!=11){
        layer.alert("必须选择10个产品");
        flag=false;
        return;
    }
    $("#form1 input[name='TID']").remove();
    for(var i=0;i<checkedObjs.length;i++) {
        var obj = checkedObjs[i];//将选中的值放到input中传到后台
        if(obj.TID) {
            $("#form1").append("<input type='hidden' name='TID' value='"+obj.TID+"' >");  //在form里增加input,将字符串数组传到后台
        }
    }

 

后台java接收:

 

//保存升级包
    @RequestMapping(value = "/saveLevelPackage", method = RequestMethod.POST, produces = "text/html;charset=utf-8")
    @ResponseBody
    public String saveLevelPackage(@RequestParam HashMap<String, String> param,
                                   @RequestParam(value = "file") MultipartFile[] files,
                                   HttpServletRequest request,
                                   String T_PACKAGE_CODE, HttpServletRequest req) {
        String result;
        String[] TIDs = req.getParameterValues("TID"); //在request中用字符串数据接收
        try{
            if(T_PACKAGE_CODE!=null&&!T_PACKAGE_CODE.equals("")){
                orderManageService.removeLevelPackageTrain(param);
                orderManageService.updateLevelPackage(param);
            }else{
                orderManageService.saveLevelPackage(param);
            }
            if(TIDs!=null){
                for(int i=0;i<TIDs.length;i++){
                    if(TIDs[i].equals("1")){
                        continue;
                    }
                    param.put("TID",TIDs[i]);
                    orderManageService.addLevelPackageTrain(param);  //循环保存
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        result = "完成";
        return JSON.toJSONString(result);
    }

java取值时:

//获取升级包等级价格
    @RequestMapping(value = "/getTrainList1", method = RequestMethod.POST, produces = "text/html;charset=utf-8")
    @ResponseBody
    public String getTrainList1(@RequestParam HashMap<String, String> param) {
        RetBase ret = new RetBase();
        List<Map<String, String>> list = new ArrayList<>();
        try {
            list = orderManageService.getTrainList1(param);
            Map<String, String> parent = new HashMap<>();
            parent.put("TITLE", "系统产品");  //因为关系中没有父类,手动加一个父类
            parent.put("PID", "0");
            parent.put("TID", "1");
            list.add(parent);
            ret.setSuccess(true);
            ret.setData(list);
        } catch (Exception e) {
            ret.setSuccess(false);
        }


        return JSON.toJSONString(list);  //直接将结果集用字符串输出
    }

 

 

 

 

 

 

 

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆趣编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值