最近研究了下ext,其漂亮的UI十分吸引人。但是在制作tree控件的时候,利用JSON处理不是特别方便。因为大部分的应用的菜单都是配置在XML格式的文件中。于是,我写了一个XML文件,利用DOM4J解析XML文件,生成JSON字符串到前台。特殊的一点是,这个布局左边是一个accordion布局,于是利用XML文件中的sub-menu进行了配置。具体的XML格式如下:
<?xml version="1.0" encoding="UTF-8"?>

<menu-config>

<sub-menu id="subMenu1" text="用户管理">

<tree id="990011" text="人员管理" href="#" leaf="true" />

<tree id="990021" text="单位管理" href="#" leaf="true" />

<tree id="990031" text="行政代码管理" href="#" leaf="true" />

<tree id="990041" text="用户管理" href="#" leaf="true" />

<tree id="990051" text="权限功能管理" href="#" leaf="true" />

</sub-menu>

<sub-menu id="subMenu2" text="采伐证管理">

<tree id="990011" text="人员管理" href="#" leaf="true" />

<tree id="990021" text="单位管理" href="#" leaf="true" />

<tree id="990031" text="行政代码管理" href="#" leaf="true" />

<tree id="990041" text="用户管理" href="#" leaf="true" />

<tree id="990051" text="权限功能管理" href="#" leaf="true" />

</sub-menu>

</menu-config>

最终页面效果如下示:

代码比较多,不能全部贴出来,最核心的JS贴出来看看。

Ext.onReady(function()
{

Ext.state.Manager.setProvider(new Ext.state.CookieProvider());


Ext.Ajax.request(
{

url : "txn900002.do",

method : "get",


success : function(response, options)
{

var array = Ext.util.JSON.decode(response.responseText);


for (var i = 0; i < array.length; i++)
{

var obj = array[i];


accordion.add(
{

id : obj.id,

title : obj.text,

html : "<div align=left valign=top id=" + obj.id

+ "></div>"

});

accordion.doLayout(true);

buildTree(obj.id);

}

}

});


var tab = new Ext.TabPanel(
{

region : "center",

margins : "0 5 0 0",

deferredRender : false,

activeTab : 0,

resizeTabs : true,

enableTabScroll : true

});


tab.add(
{

id : "welcome",

title : "welcome",

html : "<hr><h1>hello world</h1>"

});


function treeClick(node, e)
{


if (!node.isLeaf())
{

e.stopEvent();


} else
{

var n = tab.getComponent(node.id);

alert(node.href);


if (!n)
{


var n = tab.add(
{

"id" : node.id,

"title" : node.text,

closable : true,

html : "<iframe src=txn" + node.id

+ ".do style='width:100%;height:100%' ></iframe>"

});

}

tab.setActiveTab(n);

}

}


function buildTree(subMenuId)
{


var root = new Ext.tree.AsyncTreeNode(
{

text : "Autos",

draggable : false,

id : "source"

});


var tree = new Ext.tree.TreePanel(
{

el : subMenuId,

border : 0,

animate : true,

enableDD : false,


loader : new Ext.tree.TreeLoader(
{

dataUrl : "txn900001.do?subMenuId=" + subMenuId,

requestMethod : "GET"

}),

root : root,

rootVisible : false,

autoHeight : true,

containerScroll : false

});

tree.render(subMenuId);

root.expand();

tree.on("click", treeClick);

}


var header = new Ext.Panel(
{

region : "north",

margins : "0 5 0 5",

height : 80,

collapsible : true,

split : true,

minSize : 80,

maxSize : 80

});


var status = new Ext.Panel(
{

region : "south",

margins : "0 5 5 5",

height : 20,

minSize : 20,

maxSize : 20,

split : true

});


var accordion = new Ext.Panel(
{

region : "west",

margins : "0 0 0 5",

split : true,

width : 210,

layout : "accordion",

autoScroll : true,

animCollapse : false,

animate : true,


layoutConfig :
{

animate : true

}

});


var viewport = new Ext.Viewport(
{

layout : "border",

items : [header, status, accordion, tab]

});

});
