Ztree加载完成默认选中根节点右侧生成表格

需求:页面加载完成之后,默认选中ztree的根节点,并执行其点击方法,右侧生成表格;
效果:如下图所示;
思路:在节点点击事件clickNode方法中根据节点的部门code查询这个部门下的所有员工,并在右侧渲染layui表格。
function clickNode(e,treeId,treeNode) {
    getUserList(treeNode);
}
function getUserList(treeNode) {
    table.render({
        .....
    });
}
这样的话在点击这个节点的时候在右侧生成表格是没有问题的,但是如果想在页面加载完成之后自动选中这个节点,并在右侧生成表格,就需要下面的代码:
$(document).ready(function() { 
                $.ajax({
                     type : "POST",
                     dataType : "json",
                     url :  "*****",
                     async : false,
                     success : function(data) {
                           zTree = $.fn.zTree.init($("#mytree"),  setting, data);
                           zTree.expandAll(zTree);
                           var treeObj =  $.fn.zTree.getZTreeObj("mytree"); //获取ztree对象
                           var node =  zTree.getNodeByParam('level', 0); // 获取根节点
                           treeObj.selectNode(node); // 选择节点
                           clickNode(null,  zTree.setting.treeId, node); // 调用事件方法
                     },
                     
                     error : function(error) {
                           layer.msg('数据加载失败!', {
                                icon : 2,
                                time : 1500
                           })
                     }
                });
           });
在加载完成后再执行点击事件的方法clickNode,理论上是可行的,但是执行代码的时候就会一直报错,table is not defined,原来是因为页面加载顺序问题,导致左边ztree先加载完成需要使用右边layui的table对象,作如下处理,ztree加载完成之后等待一秒钟让layui加载,再执行点击方法,代码如下:
$(document).ready(function() {
                $.ajax({
                     type : "POST",
                     dataType : "json",
                     url :  "*****",
                     async : false,
                     success : function(data) {
                           zTree = $.fn.zTree.init($("#mytree"),  setting, data);
                           zTree.expandAll(zTree);
                           var treeObj =  $.fn.zTree.getZTreeObj("mytree");
                           var node =  zTree.getNodeByParam('level', 0);
                           treeObj.selectNode(node); // 选择点
                           setTimeout(function(){
                                clickNode(null,  zTree.setting.treeId, node); // 调用事件方法
                           },1000);    
                     },
                     error : function(error) {
                           layer.msg('系统错误!', {
                                icon : 2,
                                time : 1500
                           })
                     }
                });
           });

update  at 2018-12-17 14:57

今天在测试过程中发现了一个更好的解决方法,layui的回调方法是在$().ready()方法之后执行的,那么也就是说在页面初始加载的时候如果先执行$().ready()方法里面的内容时可以的,但是如果这个方法里用到了layui里面的组件,那就会出现本文产生的问题。既然layui也是在页面完成之后再进行加载,那么我就想着这个方法是不是可以代替$().ready()?

layui.config({
            base : '${ctx}/static/layuiadmin/'
        }).extend({
            index : 'lib/index'
        }).use([ 'index', 'table', 'layer', 'form' ], function() {
            var $ = layui.$;
            var form = layui.form;
            table = layui.table;
            form.render();
            
            loadDefaltTable();    
});
function loadDefaltTable() {
 $.ajax({
     type : "POST",
     dataType : "json",
     url :  "*****",
     async : false,
     success : function(data) {
       zTree = $.fn.zTree.init($("#mytree"),  setting, data);
       zTree.expandAll(zTree);
       var treeObj =  $.fn.zTree.getZTreeObj("mytree");
       var node =  zTree.getNodeByParam('level', 0);
       treeObj.selectNode(node); // 选择点
       clickNode(null,  zTree.setting.treeId, node); // 调用事件方法  
     },
   error : function(error) {
        layer.msg('系统错误!', {
               icon : 2,
                time : 1500
        })
   }
});

}

于是我把上文的代码封装成方法,写到了layui的回调里,测试一波是可行的。这样如果页面上使用了layui的组件时就可以用layui的回调代替$().ready()方法。

posted @ 2018-11-21 19:03  Kingram  阅读(2024)  评论(4编辑  收藏  举报