?
- 业务需求:软件开发过程中经常遇到将业务数据在页面上加载为树形方式,以展现为层次型信息。
-
需求分析
- 可通过后台动态构件tree上所展展现的数据,前台声明一个TreePanel对象后,可以将请求后返回的数据加载到对象上;
- TreePanel可以指定请求的Url,也可以指定异步或同步的加载方式
- TreePanel可以指定是否显示复选框,以完成复选或单选功能
- 提供获取当前选择的节点的功能
-
程序设计
- 首先,新增斩TreePanel继承自Ext.tree.TreePanel,以保证保留原来的TreePanel的同时,扩展新需求:
justgin.bap.TreePanel = Ext.extend(Ext.tree.TreePanel, { title: '树', rootText: '根节点', rootId: '', manageAble: true, autoScroll: true, url: '/Domain/DynamicTreeAjax.do', //查询数据的地址 urlParams: {}, serviceUrl: '', //外部接口,查询数据的serviceUrl checkBox: false //指定是否有复选框 });?
?? b.然后,扩展initComponent方法,以实现动态加载数据的功能:
??
initComponent: function() { var me = this this.addEvents( "beforeloadnode", "loadnode" ) //设置根节点 var rootConfig = { text: me.rootText, id: me.rootId, draggable: false, leaf: false } this.root = new Ext.tree.AsyncTreeNode(rootConfig) if(me.url != '') { this.loader = new Ext.tree.TreeLoader({ dataUrl: me.url, params: Ext.apply(me.urlParams, {serviceUrl: me.serviceUrl}), listeners: { 'beforeload': function(l, n) { me.fireEvent('beforeloadnode', n, me) l.baseParams = Ext.apply(me.urlParams, {serviceUrl: me.serviceUrl}) }, 'load': function(l, n) { me.fireEvent('loadnode', n, me) l.baseParams = Ext.apply(me.urlParams, {serviceUrl: me.serviceUrl}) } } }); if(me.checkBox) { Ext.apply(this.loader, {baseAttrs: {uiProvider : Ext.ux.TreeCheckNodeUI}}); } } me.on("render", function(me) { me.getRootNode().expand(false) }), justgin.bap.TreePanel.superclass.initComponent.call(this); } ?
??? c.扩展方法getSelected(),返回单选时,当前选中的节点
?
getSelected: function() { var nd = this.getSelectionModel().getSelectedNode(); return nd; }?
?? d.扩展方法getChecked(),返回有复选框时,选中的节点的集合(TODO)
?? e.后台返回数据的格式为Ext.tree.Panel可接受的josn格式,如下格式所示,目前许多开源的jsonUtility都提供json格式的封装,后面会专门开篇介绍本人对业务对象与json数据之间转换的设计。
?
[{ "text": "adapter", "id": "source\/adapter", "cls": "folder" }, { "text": "dd", "id": "source\/dd", "cls": "folder" }, { "text": "debug.js", "id": "source\/debug.js", "leaf": true, "cls": "file" }]
?
? 4.使用方法
?
var tree = new Beidasoft.Bap.TreePanel({ id: 'lefttree', title: 'SampleTreePanel', border: false, serviceUrl: 'ExtObjectData/extTree', //此处请求的是后台Bean中的一个方法,返回能接受的json格式 renderTo: 'divtest' });
?