ztree入门应用(二)

  时间不稳定,写东西都是断断续续的,今天来的早,继续写昨天没写完的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代码太多,一直贴代码也不是事,以后写总结的时候还是得改变改变风格。

时间: 2024-08-28 14:58:30

ztree入门应用(二)的相关文章

Bootstrap入门(二)栅格

Bootstrap入门(二)栅格 全局CSS样式--栅格 先引入本地的CSS文件(根据自己的文件夹,有不同的引入地址,我是放在一个新建的名为css的文件夹中) container 容器,栅格系统是依赖容器存在的 ... Bootstrap 提供的栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列. 栅格系统用于通过一系列的行(row)与列(column)的组合来创建页面布局.参数: 超小屏幕 手机 (<768px) 小屏幕 平板 (≥768px) 中等屏幕 桌面显示

[WebGL入门]十二,模型数据和顶点属性

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 顶点属性的意思 上次的文章中,介绍了一下从着色器的生成,编译,到程序对象的生成和着色器的连接.这次,简单的说一下模型数据的定义和顶点属性的处理.另外,介绍一下根据模型数据生成VBO的方法.VBO的使用要比生成难理解一些,但是不要担心,后面会慢慢说明.接下来看一下顶点属性.顶点属性,说的简单点,

Project Server 2013新手入门 (二)为PWA用户分配权限

上一篇文章我们讲到怎么为project server 2013 的PWA网站添加用户,那么用户添加好了,我们怎么给这些用户设置相应的权限,来对应我们项目管理中不同的角色(项目经理,资源经理.员工.负责人等),以便他们在项目整个过程中行使的权利和责任体现在我们的Project Server PWA的项目管理中心. 为用户分配PWA的全局权限(关于这个全局权限,我会在以后的文章中介绍) 执行完以上步骤之后,我们将在Project Server 2013 "服务器设置"下管理用户. 1)返回

HTML入门(二)

外部样式表当样式需要被应用到很多页面的时候,外部样式表将是理想的选择.使用外部样式表,你就可以通过更改一个文件来改变整个站点的外观. <head> <link rel="stylesheet" type="text/css" href="mystyle.css"> </head> 内部样式表当单个文件需要特别样式时,就可以使用内部样式表.你可以在 head 部分通过 <style> 标签定义内部样式

C语言快速入门教程(二)

C语言快速入门教程(二) C语言的基本语法 本节学习路线图: 引言: C语言,顾名思义就是一门语言,可以类比一下英语; 你要说出一个英语的句子需要:  单词  +  语法!  将单词按照一定的语法拼凑起来就成了一个英语句子了; C语言同样是这样,只不过单词可以理解为一些固定的知识点,而语法可以理解为算法(可以理解为解决问题的方法) 在这一节中我们就对固定知识点中的语言描述与数据存储进行解析! 1.C语言的基本元素 1.1  标识符 什么是标识符? 答:在C语言中,符号常量,变量,数组,函数等都需

Maven入门系列(二)--设置中央仓库的方法

原文地址:http://www.codeweblog.com/maven入门系列-二-设置中央仓库的方法/ Maven仓库放在我的文档里好吗?当然不好,重装一次电脑,意味着一切jar都要重新下载和发布. 下载的地址是中央仓库mvnrepository.com,当然,全球很多个仓库. 资源的坐标简称GVA 那么,现在如何修改maven的本地仓库路径呢? 关键在于maven文件夹的config下的settings.xml(E:\IDE\apache-maven-3.3.1\conf\settings

Java入门(二)——果然断更的都是要受惩罚的。。。

断更了一个多月,阅读量立马从100+跌落至10-,虽说不是很看重这个,毕竟只是当这个是自己的学习笔记,但有人看,有人评论,有人认同和批评的感觉还是很巴适的,尤其以前有过却又被剥夺的,惨兮兮的. 好好写吧. 现在开展的“业务”,一个是PHP,一个是Android开发. 前者偏向于三个方向,总结之前的(看书,敲代码实现),电商网站的开发,一些技能的实现: 后者起步阶段,一边Java学习,一边动手做东西出来,争取一周内有个交代吧先. 今天还比较坑一点,把昨天弄的卸载了,AS中的虚拟界面用不了,用哥们儿

DWR入门实例(二)

DWR(Direct Web Remoting) DWR is a Java library that enables Java on the server and JavaScript in a browser to interact and call each other as simply as possible. Dwr能让在服务器端的java代码和浏览器客户端的javascript代码尽可能简单的相互调用. DWR is Easy Ajax for Java!  官网:http://d

JSON入门之二:org.json的基本用法

廊坊的风一如既往的在窗外刮着,天地间肆意地飘洒,纵情在一刹那,为何现在只剩下风吹乱我的发,乱蓬蓬的,还是去超市逛逛吧,买吃的`(*∩_∩*)′,走进华联超市,热情的店员招呼着我,开始为我介绍,推荐各种各样商品,店员向我推荐了他们的会员卡,全场所有项目均八折,每逢节假日打五折,我心想那太划算了,而且他们总店,分店,加盟店都可以用,所以就办了张会员卡.今天我们的设计模式就从超市会员卡开始说起. 这个俨然就是我们设计模式中的组合模式----组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,

DataVeryLite入门教程(二) Entity篇

DataVeryLite 是基于.net 4.0的数据库持久化ORM框架. 目前支持的数据库有Sqlserver,Mysql,Oracle,Db2,PostgreSql,Sqlite和Access. 最好先阅读DataVeryLite入门教程(一) 配置篇,然后再阅读本篇.如果你觉得麻烦也可以跳过. Entity是ORM中的核心对象之一,一个继承Entity的对象对应于数据库中的一个表. Entity提供丰富的API对表中的单条数据进行操作. 比如根据id或其他条件,加载,删除,插入,更新和部分