ztree入门应用(二)


http://www.cnblogs.com/liaidai/p/4741341.html



 时间不稳定,写东西都是断断续续的,今天来的早,继续写昨天没写完的ztree,昨天还差一个callback没写,其实这个才是最重要的。废话不多说,开始。

callback

复制代码
callback: {
        onClick : showInfo,
        onRightClick: showMenu,
        
        beforeRemove : isRemove,
        beforeRename : isRename,
        
        onRemove : remove,
        onRename : rename,
        
        beforeCheck : zTreeBeforeCheck,
        onCheck : zTreeOnCheck,
    },
复制代码

  onClick:用于捕获节点被点击的事件回调函数;如果设置了 setting.callback.beforeClick 方法,且返回 false,将无法触发 onClick 事件回调函数。默认值为null

复制代码
/**
 * @param event
 * @param treeId
 * @param treeNode
 */
function showInfo(event, treeId, treeNode){
    if(treeNode.type == "f"){// 无需统计叶子节点
        return;
    } else if(treeNode.type == "m"){// 统计模块
        addUpForModule(treeNode.id);
    } else if(treeNode.type == "s"){// 统计系统
        addUpForSystem(treeNode.id);
    }
    showTable(requireCount);
    showChart(requireCount);
}
复制代码

注:event  js event对象,treeId  String类型,对应ztree的treeid,便于用户操作;treeNode  JSON类型,被点击的节点的JSON数据对象,clickFlag  number 节点被点击后的选中操作类型。

  onRightClick:用于捕获 zTree 上鼠标右键点击之后的事件回调函数,默认值为null;

      如果设置了 setting.callback.beforeRightClick 方法,且返回 false,将无法触发 onRightClick 事件回调函数。

      只要将 function 的引用赋给 onRightClick 属性,则右键点击 zTree 时,将屏蔽浏览器的右键菜单。

复制代码
/**
 * 右键菜单显示
 * show the action menu while right click the node
 * @param event
 * @param treeId
 * @param treeNode
 */
function showMenu(event, treeId, treeNode){
    currNode = treeNode;
    $("#rightClickMenu").css({
        "top" : event.clientY + "px",
        "left" : event.clientX + "px",
    }).show();
}
复制代码

参数和上面的onclick参数类似,不在解释了;唯一要说的就是treeNode,如果右键点击不在节点上,那么返回null;

  beforeRemove:用于捕获节点被删除之前的事件回调函数,并且根据返回值确定是否允许删除操作,默认值为null;返回值为true/false,如果返回false,ztree将不删除节点,也无法触发onremove事件回调函数;

  

复制代码
/**
 * action before remove a node
 * @returns {Boolean}
 */
function isRemove(treeId, treeNode){
    if(confirm("要删除该节点吗? ")){
        return true;
    }
    return false;
}
复制代码

  beforeRename:用于捕获节点编辑名称结束(Input 失去焦点 或 按下 Enter 键)之后,更新节点名称数据之前的事件回调函数,并且根据返回值确定是否允许更改名称的操作;默认值为null.

复制代码
/**
 * action before rename a node
 * @returns {Boolean}
 */
function isRename(treeId, treeNode, newName, isCancel){
    if(isCancel){
        return false;
    }
    if(confirm(" rename to " + newName)){
        return true;
    }
    return false;
}
复制代码

  注:newName为修改后的名称,isCancel boolean类型,是否取消操作,isCancel = true 表示取消编辑操作(按下 ESC 或 使用 cancelEditName 方法),isCancel = false 表示确认修改操作,回调函数的返回值为true/false。

  如果返回 false,zTree 将保持名称编辑状态,无法触发 onRename 事件回调函数,并且会导致屏蔽其它事件,直到修改名称使得 beforeRename 返回 true

  如果返回 false,不会让 input 输入框获取焦点,避免由于警告信息而导致反复触发 beforeRename。 请在关闭提示警告信息后,利用 editName 方法让 input 重新获取焦点。

  beforeCheck:用于捕获 勾选 或 取消勾选 之前的事件回调函数,并且根据返回值确定是否允许 勾选 或 取消勾选,默认值:null;

复制代码
/**
 * @param treeId
 * @param treeNode
 * @returns {Boolean}
 */
function zTreeBeforeCheck(treeId, treeNode) {
    return true;
};
复制代码

返回值是 true / false;如果返回 false,将不会改变勾选状态,并且无法触发 onCheck 事件回调函数;

  onCheck:用于捕获 checkbox / radio 被勾选 或 取消勾选的事件回调函数,如果设置了 setting.callback.beforeCheck 方法,且返回 false,将无法触发 onCheck 事件回调函数。默认值:null

复制代码
/**
 * @param event
 * @param treeId
 * @param treeNode
 */
function zTreeOnCheck(event, treeId, treeNode) {
    var datas = {
        'id' : treeNode.id,
        'type' : treeNode.type,
        'checked' : treeNode.checked
    };
    $.ajax({
        url : stateURL,
        data : datas,
        error : function(mes) {
            alert("请检查网络" + mes);
        }    
    });
};
复制代码

  其实就是记录节点的选中状态,我这里是选中之后将结果记录在数据库了,所以有后台操作。treeNode是选中节点的JSON对象,因此可以使用treeNode拿到节点对应的值,传到后台进行修改。

后台代码:

复制代码
private Integer id;
    private String type;
    private boolean checked;
    
    public String updateState(){
        nodeService.updateTreeState(id, type, checked);
        this.reply("1");
        return null;
    }
复制代码

--------------------------------------华丽分割线------------------------------------------------------------------------------------------------------------------

  上面的基本就是翻译了一下API,没什么卵用,下面其实也没什么用,但是做了这个功能就加上吧。什么呢,就是树的下面有一个一次加载全部的按钮,点击按钮,展示树的全部节点,下面上代码:

首先是页面:

<button id="btn_loadAll" class="btn btn-primary btn-sm">
                        加载全部&nbsp;<i class="glyphicon glyphicon-download"></i>
                    </button>

JS事件:

复制代码
$("#btn_loadAll").on('click', function(){
        $.post(getAllUrl, { 'pid' : 0 }, 
            function(msg) {
                if (msg) {
                    var nodeArr = eval("(" + msg + ")");
                    var len = nodeArr.length;                                 
                    for ( var i = 0; i < len; i++) {
                        if(nodeArr[i].type != "f"){
                            nodeArr[i].open = true;
                        }
                    }
                    $.fn.zTree.init($("#tree"), setting, nodeArr);
                }
            }
        );
    });
复制代码

后台代码:

复制代码
public String getAll(){
        Integer rid = SessionUtils.getCurrentRequireFromSession(request).getId();
        List<SystemModule> list = nodeService.getWholeTree(rid);
        String json = new Gson().toJson(list);
        try {
            response.setContentType("text/plain");
            response.setCharacterEncoding("utf-8");
            PrintWriter out = response.getWriter();
            out.print(json);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return null;
    }
复制代码

  注:得说明一点,JS事件异步加载数据的时候传递了一个pid是0,但是在后台代码里面没有用到,但是却用到了另外一个获取到的pid,这个是有其他原因吧,大家看的时候就把id看成0就是了,当然你要查出来数据的话就需要在数据库里面把pid改成0。

 具体的查询代码:

复制代码
    public List<SystemModule> getSystems(Integer pid) {
        List<SystemModule> allArr = new ArrayList<SystemModule>();
        // get the system level
        List<SystemModule> list = getNodeChildren(pid);
        // get the module level
        for(SystemModule module : list){
            allArr.add(module);
            if(!module.getType().equals("f")){
                allArr.addAll(getSystems(module.getId()));
            }
        }
        return allArr;
    }
复制代码

  这里呢,用到了递归,虽然递归的效率不高,但是这里没有那么多数据,递归就递归吧,注意一下就是了。

--------------------------------------华丽分割线------------------------------------------------------------------------------------------------------------------

  这次的总结暂时就这样吧,本来想多写点做的功能,但是JS代码太多,一直贴代码也不是事,以后写总结的时候还是得改变改变风格。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值