1. 程式人生 > >easyui treegrid動態載入節點

easyui treegrid動態載入節點

最近在做一個許可權管理系統,需要有一個選單的管理,選單的資料結構是自關聯無限極的一對多關係。在列表管理頁面決定選擇用easyui的treegrid外掛。考慮到其無限層級關係,若要一次性拿出所有資料那需要在mysql中寫函式跟儲存過程,需要有臨時表的存在,這樣會相對降低效率,所以選擇用動態非同步載入的方式請求資料

首先來看一下效果圖(第一次載入的結果頁面):


對於treegrid的使用我們可以參考官方的api : http://www.zi-han.net/case/easyui/datagrid&tree.html#treegrid  

其中動態載入的關鍵方法為:onBeforeExpand , 次方法為節點開啟前觸發的事件,我們可以在其中進行子節點的載入。

具體程式碼為:

	$(function() {
		$("#menuTree")
				.treegrid(
						{
							url : "${ctx}/menu/getFirstData",//首次查詢路徑  
							idField : 'id',
							treeField : 'name',
							parentField : 'menuid',
							rownumbers : true,
							queryParams : {
								"id" : "-1"
							},//首次查詢引數         
							columns : [ [ {
								field : "name",
								title : "名稱",
								width : 200
							}, {
								field : "description",
								title : "描述",
								width : 300
							}, {
								field : "createtime",
								title : "建立時間",
								width : 200
							}, {
								field : "icon",
								title : "圖示地址",
								width : 300
							}, {
								field : "linkurl",
								title : "連結",
								width : 300
							} ] ],
							onBeforeExpand : function(row) {
								// 此處就是非同步載入地所在
								if (row) {
									$(this).treegrid('options').url = '${ctx}/menu/getSecondData?id='
											+ row.id;
								}
								return true;
							},
							toolbar : [ {
								id : 'addLeafBtn',
								text : '新增選單',
								iconCls : 'icon-add',
								handler : function() {
									addMenu();
								}
							},'-', {
								id : 'editBtn',
								text : '修改',
								iconCls : 'icon-edit',
								handler : function() {
									$('#btnsave').linkbutton('enable');
									alert('cut')
								}
							}, '-', {
								id : 'deleteBtn',
								text : '刪除',
								disabled : true,
								iconCls : 'icon-save',
								handler : function() {
									$('#btnsave').linkbutton('disable');
									alert('save');
								}
							} ]
						});
		
	});

這是我的model物件(省略get set方法):

   public class SsmMenu { private Integer id;
    private String name;
    private String icon;
    private String createtime;
    private Integer creator;
    private String linkurl;
    private Integer status;
    private Integer menulevel;
    private Integer menuid;
    private Integer sort;
    private String description;
    private String state ;   //closed:表示有子節點   open:表示沒有子節點    
    private List<SsmMenu> children ;}

這個控制元件使用的重點在於後臺返回json資料的格式,首先我們來看第一次載入getFirstData後的json資料:
{
    "rows": [
        {
            "children": [
                {
                    "createtime": "2012-12-12 08:22:29",
                    "description": "系統",
                    "icon": "www.baidu.com",
                    "id": 1,
                    "linkurl": "www.baidu.com",
                    "menuid": -1,
                    "menulevel": 1,
                    "name": "系統管理",
                    "sort": 1,
                    "state": "closed",
                    "status": 1
                },
                {
                    "createtime": "2012-12-12 03:22:22",
                    "description": "使用者",
                    "icon": "www.baidu.com",
                    "id": 2,
                    "linkurl": "www.baidu.com",
                    "menuid": -1,
                    "menulevel": 1,
                    "name": "使用者管理",
                    "sort": 2,
                    "state": "open",
                    "status": 1
                }
            ],
            "createtime": "2012-12-12 08:22:29",
            "description": "選單",
            "icon": "www.baidu.com",
            "id": -1,
            "linkurl": "www.baidu.com",
            "name": "選單分類",
            "state": "open"
        }
    ],
    "total": 10
}
其中state是最重要的引數,若該物件中有children集合,則state表示是否展開節點,“closed”表示不展開,“open”表示展開;若該物件中無children集合則表示是否為子節點,“open”表示是子節點,“closed”表示為父節點;

接下來我們看點選展開節點時請求getSecondData返回的json資料格式

[
    {
        "createtime": "2012-12-12",
        "description": "選單",
        "icon": "www.baidu.com",
        "id": 3,
        "linkurl": "www.baidu.com",
        "menuid": 1,
        "menulevel": 1,
        "name": "選單管理",
        "sort": 1,
        "state": "closed",
        "status": 1
    }
]
注意它返回的是一個json陣列