ExtJs4实战流量统计系统----主框架搭建(三)

用ExtJs作前端框架,通常而言,主框架基本都会使用Border布局。前端

大概布局就像这个样子。node

顶部左侧通常显示系统名称,右侧用户姓名。前端框架

左侧是一个手风琴(Accordion),或者其余的,好比Tree,用以实现导航或功能菜单。app

中间就是主内容了,Tab选项卡的形式,以轻松支持多功能,同时可轻松切换,如果整个界面只支持最多一个页面的话,对于一个后台系统来讲,确实不太方便。框架

固然,也能够多加几个模块,如顶部加一个用户信息及经常使用操做的工具条。ide

=========================分隔线====================================工具

若是只是简单的实现这样的布局,那么代码能够很简单。组件化

var vp = Ext.create('Ext.Viewport', {
    layout: 'border',
    items: [
        {
            xtype: 'panel',
            region: 'north',
            height: 60
        },
        {
            xtype: 'panel',
            region: 'west',
            width: 200
        },
        {
            xtype:'panel',
            region:'center'
        }
    ]
});

定义布局为border,再定义三个内容块,分别为顶部,左侧和中间。布局

在实际项目中,直接这么简单的定义各块内容行吗?行,没问题,确定能跑起来。flex

但对于后期代码阅读、维护、扩展等,那问题就来了。

为何?由于各模块的内容远不仅这么简单,好比左侧模块,简单一些,可能就是一个Tree空间,甚至更简单一些,只是几个固定的项,那么,负责一些呢。

以此系统来讲,左侧包含三块内容:栏目列表、功能菜单、系统设置,这三块内容内部各包含一个Tree。

若是代码所有写在内容的Items里的话,层层嵌套,最终会致使单个文件过于庞大,难于阅读及维护。

=========================分隔线====================================

因此,仍是建议以ExtJs官方推荐的方式编写脚本,就是以定义(Ext.Define)的方式实现各模块,再经过动态加载按需加载所须要的文件。

且按功能分类的将脚本写在不一样的文件中,能够看下此系统的全部js文件:

 

 

Common:存放在些比较通用的东西,好比数据的Model,一些工具方法等;

Function:对应左侧模块的功能菜单,全部功能菜单里的功能都放在这;

Main:主框架文件夹,图片上有几个是没用的,暂时还没删。Center是中间主内容,LeftPanel是左侧模块,LeftTree是栏目树,SysSetTree是功能菜单树及洗头系统设置树。

Show:前端流量数据展现的一些功能;

Sys:系统设置相关功能文件。

=========================分隔线====================================

好了,说说主框架的搭建吧。

Ext.define("Yiqi.Main.Main", {
    extend: 'Ext.container.Viewport',
    requires: ['Yiqi.Main.Center', 'Yiqi.Main.LeftPanel', 'Yiqi.Common.Tools'],
    initComponent: function () {
        this.buildTop();
        this.buildLeft();
        this.buildCenter();
        Ext.apply(this, {
            layout: 'border',
            items: [
                this.topPart,
                this.leftPart,
                this.centerPart
            ]
        });
        this.callParent(arguments);
    },
    buildTop: function () {
        // 头部
        this.topPart = Ext.create('Ext.panel.Panel', {
            region: 'north',
            margin: '5 5 0 5',
            header: false,
            split: true,
            collapsible: true,
            collapseMode: 'mini',
            hideCollapseTool: true,
            contentEl: 'top_box',
            height: 45
        });
    },
    buildLeft: function () {
        //左侧菜单
        this.leftPart = Ext.create('Yiqi.Main.LeftPanel', {
            region: 'west',
            //flex:1,
            title: '功能菜单'
        });
    },
    buildCenter: function () {
        //主体内容
        this.centerPart = Ext.create('Yiqi.Main.Center', {
            region: 'center'
            //flex:4
        });
    }
});

Ext.define的方式,定义整个主框架。内部各模块组件化,这样代码看上去,简洁多了。

=========================分隔线====================================

由于我须要自定义功能菜单是以Tab选项卡的形式打开仍是弹出window的形式打开,因此,整个主框架,也就这一块花了点心思。

先看下功能菜单是怎么样的。

功能地址,就是功能所在的文件路径&文件名,也是模块的类名。

了解ExtJs动态加载的应该知道这个。

好比:用户管理,它的功能地址是Yiqi.Sys.Security.UserList,Yiqi是定义的动态加载根路径,

因此,这块功能的JS文件路径实际是:\Sys\Security\UserList.js。

功能类的定义:

Ext.define('Yiqi.Sys.Security.UserList',{
    extend:'xxxxxx',
    //.............TODO
});

 

这也是使用ExtJs的一大好处,功能菜单,能够随意的定义功能地址、打开方式等等,而不须要改任何代码,固然,你得先把功能作好。

而打开方式的实现过程,也比较简单,定义树中node的单击事件,判断单击的node,有无定义功能地址,若是有,再判断打开方式,若是是弹出窗,则以window的形式打开;若是是选项卡,则以选项卡的方式打开。

onItemClick: function (view, rec, item, idx, e) {
        var path = rec.get("LoadPath"); //--功能地址
        var openType = rec.get("OpenType"); //--打开方式
        var me = this;
        if (!Ext.Object.isEmpty(path) && !Ext.Object.isEmpty(openType)) {if (openType == "window") {
                    var win_id = 'syswin_' + rec.get("id");
                    var win = Ext.WindowManager.get(win_id);
                    if (win) {
                        Ext.WindowManager.bringToFront(win);
                    }
                    else {
                        win = Ext.create(path, {
                            title: rec.get("text"),
                            iconCls: rec.get("iconCls"),
                            id: win_id
                        });
                        win.show();
                    }
                }
                else if (openType == "tab") {
                    //--选项卡方式打开,先判断当前功能是否已经打开,若是已打开,则无需新建,直接将该功能设为活动选项卡就好了。
                    //--me.ownerCt.ownerCt.centerPart是主框架的中间内容模块。
                    var tab = me.ownerCt.ownerCt.centerPart.getComponent('tab_sys_' + rec.get('id'));
                    if (!tab) {
                        var newitem = Ext.create(path, {});
                        tab = Ext.create('Ext.panel.Panel', {
                            title: rec.get('text'),
                            itemId: 'tab_sys_' + rec.get('id'),
                            layout: 'fit',
                            closable: true,
                            iconCls: rec.get('iconCls') || 'icon_preview',
                            items: newitem
                        });
                        me.ownerCt.ownerCt.centerPart.add(tab);
                    }
                    //--设为活动选项卡
                    me.ownerCt.ownerCt.centerPart.setActiveTab(tab);
                }
        }
    }

至此,主框架就差很少了~~~

相关文章
相关标签/搜索