顶部和底部区域已经作好,在顶部区域有一个菜单的按钮,这一节我们设计一个菜单的数据结构,使其可以展示出不同样式的菜单。由于准备搭建的是一个系统模块自定义的系统,因此菜单也是自定义的,在操作员系统登录的时候,和MainModel中的其他数据一样,将会通过ajax加载要显示的菜单数据,然后生成菜单条或者菜单树。在这个例子中,我只做了二层菜单,要做三层以上的只要稍作修改即可。

下面先来看看菜单数据的定义:在MainModel中,在data属性下定义一个systemMenu的数组属性,下面就放了各个菜单项和菜单条的数据定义。

// 系统菜单的定义,这个菜单可以是从后台通过ajax传过来的
systemMenu: [{
text: '工程管理', // 菜单项的名称
icon: '', // 菜单顶的图标地址
glyph: 0,// 菜单项的图标字体的数值
expanded: true, // 在树形菜单中是否展开
description: '', // 菜单项的描述
items: [{
text: '工程项目', // 菜单条的名称
module: 'Global', // 对应模块的名称
icon: '', // 菜单条的图标地址
glyph: 0xf0f7
// 菜单条的图标字体
}, {
text: '工程标段',
module: 'Project',
icon: '',
glyph: 0xf02e
}] }, {
text: '合同管理',
expanded: true,
items: [{
text: '项目合同',
module: 'Agreement',
glyph: 0xf02d
}, {
text: '合同付款计划',
module: 'AgreementPlan',
glyph: 0xf03a
}, {
text: '合同请款单',
module: 'Payment',
glyph: 0xf022
}, {
text: '合同付款单',
module: 'Payout',
glyph: 0xf0d6
}, {
text: '合同发票',
module: 'Invoice',
glyph: 0xf0a0
}]
}, {
text: '综合查询',
glyph: 0xf0ce,
expanded: true,
items: [{
text: '项目合同台帐',
module: 'Agreement',
glyph: 0xf02d
}, {
text: '合同付款计划台帐',
module: 'AgreementPlan',
glyph: 0xf03a
}, {
text: '合同请款单台帐',
module: 'Payment',
glyph: 0xf022
}, {
text: '合同付款单台帐',
module: 'Payout',
glyph: 0xf0d6
}, {
text: '合同发票台帐',
module: 'Invoice',
glyph: 0xf0a0
}] } ]

上面菜单中定义了三个菜单项,若干个菜单条,具体的属性上面有说明。有了菜单数据,再编制一个可以根据这些数据生成菜单展示数据的函数,这个函数返回的数组可以直接供toolbar和button作为items和menu来使用。下面这个函数也是在MainModel.js中。

// 根据data.systemMenu生成菜单条和菜单按钮下面使用的菜单数据
getMenus : function() {
var items = [];
var menuData = this.get('systemMenu'); // 取得定义好的菜单数据
Ext.Array.each(menuData, function(group) { // 遍历菜单项的数组
var submenu = [];
// 对每一个菜单项,遍历菜单条的数组
Ext.Array.each(group.items, function(menuitem) {
submenu.push({
mainmenu : 'true',
moduleName : menuitem.module,
text : menuitem.text,
icon : menuitem.icon,
glyph : menuitem.glyph,
handler : 'onMainMenuClick' // MainController中的事件处理程序
})
})
var item = {
text : group.text,
menu : submenu,
icon : group.icon,
glyph : group.glyph
};
items.push(item);
})
return items;
}

下面继承toolbar自定义一个菜单条的控件。在war/app/view/main/region目录下建立文件MainMenuToolbar.js。

/**
* 系统的主菜单条,根据MainModel中的数据来生成,可以切换至按钮菜单,菜单树
*/
Ext.define('app.view.main.region.MainMenuToolbar', {
extend: 'Ext.toolbar.Toolbar',
alias: 'widget.mainmenutoolbar', defaults: {
xtype: 'buttontransparent'
}, items: [{
glyph: 0xf100,
tooltip: '在左边栏中显示树状菜单', // 几种菜单样式切换的按钮
disableMouseOver: true,
margin: '0 -5 0 0'
}, {
glyph: 0xf102,
tooltip: '在顶部区域显示菜单',// 几种菜单样式切换的按钮
disableMouseOver: true
}], viewModel: 'main', // 指定viewModel为main initComponent: function () { // 把ViewModel中生成的菜单items加到此toolbar的items中
this.items = this.items.concat(this.getViewModel().getMenus()); this.callParent();
}
});

至此菜单条控件制作完成,下面要把其加入到Main的界面之中。首先在Main.js的uses之中引入'app.view.main.region.MainMenuToolbar',然后在items中将菜单toolbar加进去。

items: [{
xtype: 'maintop',
region: 'north' // 把他放在最顶上
}, {
xtype: 'mainmenutoolbar',
region: 'north' // 把他放在maintop的下面
}, {
xtype: 'mainbottom',
region: 'south' // 把他放在最底下
}, {
region: 'center', // 中间面版
xtype: 'maincenter'
}]

一个菜单条就加入到了系统之中,来看一下效果。

系统中我共设置了4种类型的菜单,分别是:

  • 菜单按钮:在顶部的“菜单”按钮之下。
  • 菜单条:在顶部区域下面,刚做好的那个就是。
  • 菜单树:显示在左边区域的菜单树。
  • 折叠式菜单:显示在左边区域的另一种方式。

这几种菜单之间可以很方便的切换,如果认为太多了没必要,可以把不喜欢的取消掉。所有的界面都是用控件搭起来的,所以要增加一种菜单风格或取消一种都很方便。

7、手把手教你Extjs5(七)自定义菜单1的更多相关文章

  1. 8、手把手教你Extjs5(八)自定义菜单2

    这一节来定义另外三种类型的菜单类.首先定义菜单按钮类.文件放于app/view/main/region目录下面,文件名为ButtonMainMenu.js. /** * 显示在顶部的按钮菜单,可以切换 ...

  2. 15、手把手教你Extjs5(十五)各种Grid列的自定义渲染

    Grid各列已经能够展示出来了.列的类型包括字符型,整型,浮点型,货币型,百分比型,日期型和布尔型,我自定义了各种类型的渲染样式: 1.整型:标题栏居中,数值靠右显示,正数颜色为蓝色,负数颜色为红色, ...

  3. 10、手把手教你Extjs5(十)自定义模块的设计

    从这一节开始我们来设计并完成一个自定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息.以下信息只是我自己在开发过程中想到或用到的,希望有新的想法的或者有建议的跟贴回复. 一个独立模块包含以下 ...

  4. 24、手把手教你Extjs5(二十四)模块Form的自定义的设计[3]

    自定义的Form已经可以运行了,下面改一下配置,把Form里面的FieldSet放在Tab之下.修改一下ModuleModel.js中的data下的tf_FormSchemes下的方案,增加一个属性. ...

  5. 23、手把手教你Extjs5(二十三)模块Form的自定义的设计[2]

    在本节中将要加入各种类型的字段,在加入字段的时候由于可以一行加入多个字段,因此层次结构又多了一层fieldcontainer.form里面的主要层次结构如下: form -- fieldSet -- ...

  6. 22、手把手教你Extjs5(二十二)模块Form的自定义的设计[1]

    下面开始设计和完成一个简单的Form的自定义过程.先准备数据,在ModuleModel.js中的data属性下面,加入自定义Form的参数定义,下面的代码中定义了一个新的属性tf_formScheme ...

  7. 21、手把手教你Extjs5(二十一)模块Form的自定义的设计

    前面几节完成了模块Grid的自定义,模块Form自定义的过程和Grid的过程类似,但是要更复杂一些.先来设计一下要完成的总体目标. 1、可以有多个Form方案,对应于显示.新增.修改.审核.审批等功能 ...

  8. 12、手把手教你Extjs5(十二)执行菜单命令在tabPanel中显示模块

    上面设计好了一个模块的主界面,下面通过菜单命令的执行来把这个模块加入到主界面当中.在MainModule.js中有一个函数,生成了当前的菜单数据: // 根据data.systemMenu生成菜单条和 ...

  9. 9、手把手教你Extjs5(九)使用MVVM特性控制菜单样式

    菜单的样式多了,怎么可以灵活的切换是个问题. 在使用标准菜单的时候,在菜单最前面有二个按钮,可以切换到树状菜单和按钮菜单. 在树状菜单的显示区,可以切换换到标准菜单,以及折叠式菜单. 切换到按钮菜单之 ...

随机推荐

  1. VS2010 自定义向导

    最近在学OpenGL,不想使用OpenGL的GLUT工具,自己写了一个初始化OpenGL的类,并在win32中使用,每次都要新建一个win32项目,然后将OpenGL初始化类拷贝到项目,然后进行各种初 ...

  2. Sticks<DFS>

    题意: 给n个木棍,这些木棍是由m个长度均为L的木棍切割而来,求L的最小值. 思路: DFS+剪枝. 剪枝: 1:L的取值范围在n(max)和n(sum)之间,逐个枚举.sum%L!=0则L不能用. ...

  3. ReactiveX--响应式编程の相关概念 浅析

    在许多软件编程任务中,你或多或少期待你的指令将会按照你已经写好的顺序,依次增量执行和完成.但在ReactiveX,很多指令可以通过“观察者”并行执行,其结果将以任意顺序被捕获.你定义了一种“可观察的形 ...

  4. Swift中的闭包(Closure) 浅析

    转载自:http://www.devtalking.com/articles/closure-expressions-in-swift/ 闭包在Swift中非常有用.通俗的解释就是一个Int类型里存储 ...

  5. [转]Android Shape渲染的使用(经典,学习研究不后悔)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mzh3344258.blog.51cto.com/1823534/1215749 ...

  6. windows程序设计(四)

    对话框常用相关消息映射函数: 一.对话框初始化消息: 1.WM_CREATE:通用窗口初始化消息 窗口还未显示出来,只有父窗口,子窗口还没创建 2.WM_INITDIALOG:对话框窗口专用消息 子窗 ...

  7. ==和equals的异同

    == 和 Equals 的区别 1. == 是一个运算符. 2.Equals则是string对象的方法,可以.(点)出来. 我们比较无非就是这两种 1.基本数据类型比较 2.引用对象比较 1.基本数据 ...

  8. mplayer最全的命令

    前段时间做过qt内嵌mplayer的一个小程序,感觉mplayer还行不过不支持打开图片感觉有点无力.话不多说上代码: QString path="d:/1.mkv"; QWidg ...

  9. s5pv210 AD转换

    1:ADC:Analog-to-Digital Converter,模拟信号转数字信号,自然界一般为模拟信号,而SoC需要数字信号,所以之间通信需要ADC. 2:转换原理: 以逐次逼近式AD转换为例: ...

  10. ng-bind-html在ng-repeat中问题的解决办法

    <div ng-controller="MyCtrl"> Hello, {{name}}! <div class="row" ng-repea ...