一个Ext动态TreePanel构件

 

  1. 业务需求:软件开发过程中经常遇到将业务数据在页面上加载为树形方式,以展现为层次型信息。
  2. 需求分析
    1. 可通过后台动态构件tree上所展展现的数据,前台声明一个TreePanel对象后,可以将请求后返回的数据加载到对象上;
    2. TreePanel可以指定请求的Url,也可以指定异步或同步的加载方式
    3. TreePanel可以指定是否显示复选框,以完成复选或单选功能
    4. 提供获取当前选择的节点的功能
  3. 程序设计
    1. 首先,新增斩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'
});

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ExtJS 的 TreePanel 控件可以监听以下事件: 1. `beforeitemappend`:在节点被添加到 TreePanel 前触发。 2. `beforeitemcollapse`:在节点被折叠前触发。 3. `beforeitemexpand`:在节点被展开前触发。 4. `beforeiteminsert`:在节点被插入到 TreePanel 前触发。 5. `beforeitemmove`:在节点被移动前触发。 6. `beforeitemremove`:在节点被移除前触发。 7. `beforeload`:在加载节点数据前触发。 8. `checkchange`:当节点的复选框状态改变时触发。 9. `itemappend`:在节点被添加到 TreePanel 后触发。 10. `itemclick`:当节点被点击时触发。 11. `itemcollapse`:在节点被折叠后触发。 12. `itemcontextmenu`:当节点右键菜单被触发时触发。 13. `itemdblclick`:当节点被双击时触发。 14. `itemexpand`:在节点被展开后触发。 15. `iteminsert`:在节点被插入到 TreePanel 后触发。 16. `itemkeydown`:当节点键盘按下时触发。 17. `itemkeypress`:当节点键盘按键按下时触发。 18. `itemkeyup`:当节点键盘按键释放时触发。 19. `itemmousedown`:当鼠标在节点上按下时触发。 20. `itemmouseenter`:当鼠标进入节点时触发。 21. `itemmouseleave`:当鼠标离开节点时触发。 22. `itemmouseup`:当鼠标在节点上释放时触发。 23. `itemremove`:在节点被移除后触发。 24. `load`:在节点数据加载完成后触发。 25. `selectionchange`:当选择的节点发生变化时触发。 这些是常用的 TreePanel 事件,你可以根据需要选择监听相应的事件来实现对应的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值