easyui的treegrid的子节点的formatter放入menubutton菜单按钮

项目需求:

在easyui的treegrid的子节点因为某列操作栏需要定义的按钮太多,显示起来有点难看,要改为菜单显示.

做这个的时候绕了些弯路,开始的做法是把easyui-menu自动生成的所有元素都添加的formatter里面,使用字符串拼接,这样的话会发现菜单和菜单列表不能联系起来,后面再手写mouseover和mouseout方法,感觉实现起来,菜单列表的显示的定位也有问题,后面总算找到好的解决办法,如下:

​
{ field: 'action', title: '操作', width: 100,align:'center', 
     formatter:function(value,row,index){
          var menuId = row.id;
          var parent = $("#gcxh").treegrid("getParent", row.uuid);
          if(parent){//父节点不加入菜单,子节点的formatter加入菜单
               menuId = parent.id;
          }
           var yyy = '<a uid="'+menuId+'" href="javascript:void(0)" class="__zdymenu" >Edit</a>';
           yyy += '<div id="__zdymenu'+row.id+'" style="width:150px;">';
           yyy += getMenuStrForActionFun(row);
           yyy += "</div>";
           yyy += "</div>";
           str += yyy;
           return str;
}

/**
 * 每一个子节点根据节点特定的情况设置不同的菜单项
 * @param row
 */
function getMenuStrForActionFun(row){
	var str = "";
	if(row.processInfoId>0){
     	// 编制阶段也可以启用子流程
     	if(条件1...)
 		{
             str += "<div onclick='' data-options=\"iconCls:'icon1'\">审批子流程</div>";//每个菜单项
 		}
        if(条件2...)
 		{
             str += "<div onclick='' data-options=\"iconCls:'icon1'\">审批子流程</div>";//每个菜单项
 		}
 	}
	return str;
}
onExpand:function(row){
	var $menu = $('.__zdymenu[uid="'+row.id+'"]');
	for(var i = 0;i<$menu.length;i++){
		var a = $menu[i];
		var uid = $(a).attr("uid");
		var menuDiv = $(a).next("div");
		var menuDivId = $(menuDiv).attr("id");
		$(a).menubutton({
			iconCls: 'icon-edit',    
			menu: '#'+menuDivId+''   
		});
	}
}

​

如图所示:

193127_0jXK_2331760.png

这么做之后,可能会让表格的行高自适应,即会自动根据edit菜单的高度来设置行高,这样就不是很好看,此时,可可以动态的设置被展开的每个父节点所有的子节点的行高(子节点即菜单所在的行)

 

 

function initMenuFun(row){
	var $menu = $('.__zdymenu[uid="'+row.id+'"]');
	for(var i = 0;i<$menu.length;i++){
		var a = $menu[i];
		var uid = $(a).attr("uid");
		var menuDiv = $(a).next("div");
		var menuDivId = $(menuDiv).attr("id");
		$(a).menubutton({
			menu: '#'+menuDivId+''   
		});
	}
	fixEprjInfoRow(row);
}

//设置菜单所在行的行高都固定为27px
function fixEprjInfoRow(row){
	var children = row.children;
	for(var j=0;j<children.length;j++){
		$("tr[node-id='"+children[j].uuid+"']").height('27px');
	}
}

//在treegrid中的onLoadSuccess和onExpand事件中都要定义,防止菜单变形或者表格变形
$('#gcxh').treegrid({
  onLoadSuccess:function(row, data){
     if(selectRow){
         zdySelectRow = $('#gcxh').treegrid('getRowData',selectRow.uuid);
         var parent = $('#gcxh').treegrid('getParent',selectRow.uuid);
         if(parent){
            	initMenuFun(parent);
         }else{
            	initMenuFun(zdySelectRow);
         }
     }
  }

  //在treegrid的展开事件中定义:
  onExpand:function(row){
	 initMenuFun(row);
  }
})


 

转载于:https://my.oschina.net/u/2331760/blog/1612028

easyui treegrid 提供了树节点延迟加载的功能,可以将树节点的数据分批加载,只有当用户展开该节点时,才会加载该节点的子节点。下面是使用树节点延迟加载的示例代码: 1. 首先,在 easyui treegrid 的 data 属性中,需要为每个节点添加一个 "state" 属性,该属性的值为 "closed",表示该节点的子节点未加载。例如: ``` var data = [ { "id": 1, "text": "Node 1", "state": "closed" }, { "id": 2, "text": "Node 2", "state": "closed" } ]; ``` 2. 然后,在 easyui treegrid 的 onBeforeExpand 事件中,判断该节点是否已经加载子节点,如果未加载,则通过 AJAX 请求获取该节点的子节点数据,并将数据添加到该节点下。例如: ``` $('#treegrid').treegrid({ url: 'get_data.php', idField: 'id', treeField: 'text', onBeforeExpand: function(row) { if (row.children == undefined) { $.ajax({ url: 'get_children.php?id=' + row.id, dataType: 'json', success: function(data) { $('#treegrid').treegrid('append', { parent: row.id, data: data }); row.children = data; } }); } }, columns: [...] }); ``` 在这个示例代码中,通过 AJAX 请求获取该节点的子节点数据,并通过 treegrid 的 "append" 方法将数据添加到该节点下。同时,为了避免多次请求同一个节点的子节点数据,需要将已经加载的子节点数据保存在该节点的 "children" 属性中。 通过以上代码,你就可以实现 easyui treegrid 的树节点延迟加载功能。当用户展开某个节点时,会自动请求该节点的子节点数据,并将数据添加到该节点下,从而实现了分批加载数据的效果,提高了 easyui treegrid 的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值