近期在搞extjs4 TreeStore時有一個需求 就是要處理一下后台傳過來的json數據然后再顯示,看api也沒有找到解決的方法 ,最后看源代碼在Ext.data.proxy.Server 看到這么一個方法
- extractResponseData: function(response) {
- return response;
- },
Ext.define("App.store.MenuStore",{ extend:'Ext.data.TreeStore', model:'App.model.MenuModel', proxy:{ type:'ajax', url:app.contextPath + '/base/syresource!doNotNeedSecurity_getMainMenu.action', reader:"json", extractResponseData: function(response) { var json = Ext.loadFilter(Ext.JSON.decode(response.responseText),{parentField : 'pid'}); Ext.each(json,function(record){ if(Ext.isEmpty(record.children)){ record.expanded = false; record.leaf = true; }else{ record.expanded = true; } }); response.responseText = Ext.JSON.encode(json); return response } }, autoLoad: true });
大家都喜歡ztree的簡單數據結構(扁平pid結構數據集),而Extjs並沒有給我們提供,於是僅僅有我們自己動手了。
標准的 JSON 數據須要嵌套表示節點的父子包括關系
簡單模式的 JSON 數據僅須要使用 id / pId 表示節點的父子包括關系比如:
var nodes = [ {name: "父節點1", children: [ {name: "子節點1"}, {name: "子節點2"} ]} ];
比如:
var nodes = [ {id:1, pId:0, name: "父節點1"}, {id:11, pId:1, name: "子節點1"}, {id:12, pId:1, name: "子節點2"} ];
這是我希望轉換的json數據
[ { "iconCls": "ext-icon-application_view_tile", "id": "xtgl", "target": "", "text": "系統管理", "url": "/welcome.jsp" }, { "iconCls": "ext-icon-newspaper_link", "id": "zygl", "pid": "xtgl", "target": "cmp", "text": "資源管理", "url": "App.view.ResourceView" }, { "iconCls": "ext-icon-tux", "id": "jsgl", "pid": "xtgl", "target": "cmp", "text": "角色管理", "url": "App.view.RoleView" }, { "iconCls": "ext-icon-group_link", "id": "jggl", "pid": "xtgl", "target": "cmp", "text": "機構管理", "url": "App.view.OrganizationView" }, { "iconCls": "ext-icon-user_suit", "id": "yhgl", "pid": "xtgl", "target": "cmp", "text": "用戶管理", "url": "App.view.UserView" }, ]
ExtJs僅僅認識嵌套的json數據。這就須要我們進行轉換了。轉換的方法例如以下:
Ext.loadFilter= function(data, opt) { var idField, textField, parentField; if (opt.parentField) { idField = opt.idField || 'id'; textField = opt.textField || 'text'; parentField = opt.parentField || 'pid'; var i, l, treeData = [], tmpMap = []; for (i = 0, l = data.length; i < l; i++) { tmpMap[data[i][idField]] = data[i]; } for (i = 0, l = data.length; i < l; i++) { if (tmpMap[data[i][parentField]] && data[i][idField] != data[i][parentField]) { if (!tmpMap[data[i][parentField]]['children']) tmpMap[data[i][parentField]]['children'] = []; data[i]['text'] = data[i][textField]; data[i]['leaf'] = true;//推斷為葉子節點 tmpMap[data[i][parentField]]['children'].push(data[i]); } else { data[i]['text'] = data[i][textField]; treeData.push(data[i]); } } return treeData; } return data; }