`

[Ext扩展]根据后台json生成左侧导航菜单,5月9日更新1.1版本

    博客分类:
  • Ext
阅读更多
文章内不再提供示例,需要查看者请从SVN下载,地址:
http://exttools.googlecode.com/svn/trunk/
效果图:


/**
 * 扩展了Panel类,其布局设为accordion,所在区域为west;该组件初始化后会根据配置的url和root向后台发
 * 起请求并解析返回的json串,根据parentcode为空的结点生成TreePanel,子节点通过parentcode属性添加为
 * 对应结点的子节点,注意此处每个节点的code必须小于父节点并接大于下方的其它结点;
 * 
 * 1.1更新:
 * 1.不再需要leaf属性,程序内部判断;
 * 2.store用完后即销毁,不再可用;
 * 3.修改了结点点击的触发事件,仅注册一次以减少内存占用,该方法传递给监听函数一个Ext.tree.TreeNode对象,
 * 可通过node.attributes属性获取结点属性;
 * 4.添加了一个findNodeById方法,该方法通过id字符串返回对应Ext.tree.TreeNode对象;
 * 
 * @author chemzqm@gmail.com
 * @version 1.1
 * @since 2010-5-9
 *
 */
Ext.namespace("QM.ui");

QM.ui.AccordinTreePanel = Ext.extend(Ext.Panel, {
    /**
     * @cfg(url) 发送请求的地址
     */
    /**
     * @cfg(root) json数组的根字符串
     */
    margins: '5 0 5 5',
    split: true,
    width: 210,
    initComponent: function(){
        Ext.apply(this, {
            layout: 'accordion',
            region: 'west'
        })
        QM.ui.AccordinTreePanel.superclass.initComponent.call(this);
        this.addEvents(        /**
         * @event itemclick  树结点被点击时触发  参数:node 当前结点对象,record 当前结点对应record对象
         */
        'click',        /**
         * @event afterload 菜单项加载完毕后触发
         */
        'afterload');
        if (!this.store) {
            this.store = new Ext.data.JsonStore({
                url: this.url,
                root: this.root,
                fields: ['code', 'name', 'parentcode', 'iconCls', 'href']
            });
        }
        this.store.load({
            callback: this.loadTrees,
            scope: this
        });
    },
    loadTrees: function(records, o, s){
        var pnodes,trees = [],tree;
        this.store.sort('code');
        for (var i = 0; i < records.length; i++) {
            var record = records[i];
            if (!record.get('parentcode')) {
                tree = this.creatTreeConfig(record);
				trees.push(tree);
                pnodes = [];
                pnodes.push(tree.root);
            }
            else {
                var next_record = records[i + 1];
                var isLeaf = !next_record || next_record.get('parentcode') != record.get('code');
                this.addTreeNode(pnodes, record, isLeaf);
            }
        }
		Ext.each(trees,function(tree){
			this.add(tree);
		},this);
        this.fireEvent('afterload', this);
        this.mon(this.el, 'click', this.onClick, this);
        this.doLayout();
        this.store.destroy();
    },
	findNodeById:function(id){
		var node,trees = this.findByType('treepanel',true);
		Ext.each(trees,function(tree){
			node = tree.getNodeById(id);
			return !node;//找到的话返回false
		});
		return node;
	},
    onClick: function(e, t, o){
		if(Ext.fly(t).hasClass('x-tree-ec-icon')){//点击伸展按钮时无视
			return;
		}
		var el,id,node;   
		if (el = e.getTarget('.x-tree-node-el', 3,true)) {
			e.stopEvent();
			id = el.getAttributeNS('ext','tree-node-id');
			node = this.findNodeById(id);
			this.fireEvent('click',node);
		}
    },
    creatTreeConfig: function(record){
        var config = {
            xtype: 'treepanel',
            autoScroll: true,
            rootVisible: false,
            title: record.get('name'),
            iconCls: record.get('iconCls'),
            root: {
                nodeType: 'async',
                expanded: true,
                id: record.get('code'),
                children: []
            }
        };
        return config;
    },
    addTreeNode: function(pnodes, record, isLeaf){
        var len = pnodes.length;
        for (var i = len - 1; i >= 0; i--) {
            if (pnodes[i].id != record.get('parentcode')) {
                pnodes.pop();
            }
            else {
                var parent = pnodes[i].children;
                var node = {
                    text: record.get('name'),
                    id: record.get('code'),
                    iconCls: record.get('iconCls'),
                    href: record.get('href'),
                    leaf: isLeaf
                };
                if (!isLeaf) {
                    node.children = [];
                    pnodes.push(node);
                }
                parent.push(node);
                return;
            }
        }
    }
});

Ext.reg('accTree', QM.ui.AccordinTreePanel);


示例js:
new Ext.Viewport({
                    layout: 'border',
                    items: [{
                        xtype: 'accTree',
						title : '菜单',
						root : 'menus',//必须要配
                        url: 'menu.json',//必须要配
						listeners:{
							'click':function(node){
								alert(node.attributes.href);
							}
						}
                    }, {
                        region: 'center',
                        html: 'center'
                    }]
                });
            });
  • 大小: 11.7 KB
3
6
分享到:
评论
3 楼 zhihaokesion 2011-12-08  
alert(node.attributes.href)  href 属性显示未定义,博主能否解释一下。
2 楼 天空之城 2011-01-04  
thanks,请问其他的模块如何加载?
1 楼 magicyz 2010-08-23  
看了你的东西,感觉应该有用,就是,文章写得太不仔细,没有多大参考价值!

相关推荐

    java后台生成JSON数据

    Java 后台生成 JSON 数据是现代 Web 应用开发中的常见任务,特别是在与前端框架如 EXT 进行数据交互时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器解析...

    Ext1.1中文文档

    3. **数据绑定**:1.1版本已经具备了基本的数据绑定功能,允许UI与后台数据模型进行双向同步,简化了数据管理。这对于动态更新界面和处理用户输入至关重要。 4. **布局管理**:ExtJS提供多种布局模式,如fit布局、...

    Ext 根据数据库返回json动态生成grid列表实例

    在本文中,我们将深入探讨如何使用ExtJS框架根据数据库返回的JSON数据动态生成Grid列表实例。ExtJS是一款强大的JavaScript库,常用于构建富客户端应用程序,尤其是数据可视化和数据管理组件,如Grid。Grid是ExtJS中...

    ext json请求java后台返回集合数据

    标题中的“ext json请求java后台返回集合数据”指的是在Web开发中,前端EXTJS库通过JSON格式发送请求到Java后台,后台处理后返回一个集合(可能是列表或数组)的数据。EXTJS是一个用JavaScript编写的富客户端框架,...

    生成JSON树型表结构

    EXT框架,作为一个强大的前端组件库,提供了丰富的UI控件,其中包括树形组件(EXT树),它能够根据JSON数据生成交互式的树状结构。 EXT树是EXT JS库中的一个组件,用于展示层级关系的数据,比如目录结构、组织架构...

    Jtopo读取Json生成树状拓扑图

    Jtopo读取Json生成树状拓扑图,Json结构如下,可添加业务需要字段 // id 节点唯一标识 // name 节点名字 // type 节点类型 // pid 父节点标识 // error “0”无异常 “1”有异常 // errorMessage 异常...

    Ext.net1.1

    这个版本的更新主要是为了增强其对Internet Explorer 9的兼容性,同时也引入了新的Coolite功能,使得用户界面更加现代化和用户友好。 一、Ext.NET概述 Ext.NET是一个强大的Web开发框架,它基于流行的JavaScript库...

    AnyFo - Util - Json4Ext:通用ExtJS数据交换处理

    在大家开发的系统中,如果程序用ExtJS做表现层,那么就需要使ExtJS开发的界面和后台Java代码中生成的数据交互,一般来说,可以选 择XML格式和Json格式的数据进行交互,但是XML格式的数据操作相对繁琐,因此,大部分...

    ext1.1 api(chm_en)

    这份API文档是开发者理解和掌握EXT1.1版本核心功能的关键工具。 首先,EXT1.1 API文档详细阐述了EXT库中的各个类和方法,涵盖了从基础组件到高级组件的完整体系。开发者可以通过查阅文档了解如何创建窗口(Windows...

    ext1.1文档

    ext1.1文档,html格式的,全部文挡,官方的

    读Ext之十(解析JSON)

    在深入探讨“读Ext之十(解析JSON)”这一主题之前,我们首先需要理解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,设计简单且易于人阅读和编写,同时...

    Extjs 无限树菜单 后台拼接json

    "Extjs 无限树菜单 后台拼接json"这个主题涉及到如何在后端生成无限级别的树形菜单数据,并通过JSON格式传输到前端进行渲染。 首先,我们要理解树形菜单的基本概念。树形菜单是一种以节点和层级关系展示数据的控件...

    ext.net后台管理

    5. **AJAX和Comet支持**:EXT.NET内置了对AJAX的全面支持,可以实现页面无刷新更新,提高用户体验。同时,Comet技术的集成使得实时数据推送成为可能。 6. **强大的图表库**:EXT.NET提供了丰富的图表组件,可以生成...

    Ext.tree.TreeLoader附带封装的json类

    在本文中,我们将深入探讨`Ext.tree.TreeLoader`与JSON数据在Ext JS框架中的应用。`Ext.tree.TreeLoader`是Ext JS库中的一个组件,它负责加载和解析树形结构的数据,而JSON(JavaScript Object Notation)则是一种轻...

    EXT实例+JSON

    5. **绑定数据**:EXT的组件可以直接与数据存储绑定,当数据改变时,组件会自动更新。例如,将数据存储绑定到`Ext.grid.Panel`,数据就会自动显示在表格中。 6. **事件监听**:EXT提供了丰富的事件系统,可以监听...

    ext-grid+json简单应用

    在"EXT-GRID+JSON简单应用"中,我们将探讨如何使用EXT-JS的Grid组件与JSON数据源进行集成,以创建一个动态的数据表格。 EXT-JS的Grid组件允许开发者通过定义列模型、存储器和视图来展示数据。在JSON方面,它是一种...

    ext1.1帮助文档

    "ext1.1帮助文档"是针对一个名为"ext1.1"的软件或库的官方指导材料,它提供详尽的信息,帮助用户理解和使用这个技术。EXT在这里可能指的是一个JavaScript框架,如Ext JS,这是一个广泛用于构建富互联网应用程序(RIA...

    php扩展开发框架生成脚本ext_skel

    通常,开发扩展时,首先需要运行`ext_skel`,提供必要的参数,如扩展名和函数列表,然后它会生成一个包含所有必需文件和目录结构的骨架项目。这些文件包括C源代码、配置脚本、头文件以及相关的Makefile,这些都是...

    ext前后台交互实例

    "ext前后台交互实例"这一主题聚焦于如何通过JSON(JavaScript Object Notation)格式的数据进行前后端之间的通信,以实现数据的高效传输和处理。本文将深入探讨此主题,解析其中的关键概念和技术细节。 ### JSON在...

    EXT JSON Sqlserver 分页 全部正常运行

    5. 示例的实现流程:用户在EXT JS的Grid中触发分页操作,请求发送到JSP页面,JSP调用JavaBean执行SQL查询,获取指定范围的数据,将结果集转化为JSON,最后返回给EXT JS应用,更新Grid显示。 这个例子涵盖了前端开发...

Global site tag (gtag.js) - Google Analytics