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

  1. // 系统菜单的定义,这个菜单可以是从后台通过ajax传过来的
  2. systemMenu : [{
  3. text : '工程管理', // 菜单项的名称
  4. icon : '', // 菜单顶的图标地址
  5. glyph : 0,// 菜单项的图标字体的数值
  6. expanded : true, // 在树形菜单中是否展开
  7. description : '', // 菜单项的描述
  8. items : [{
  9. text : '工程项目', // 菜单条的名称
  10. module : 'Global', // 对应模块的名称
  11. icon : '', // 菜单条的图标地址
  12. glyph : 0xf0f7
  13. // 菜单条的图标字体
  14. }, {
  15. text : '工程标段',
  16. module : 'Project',
  17. icon : '',
  18. glyph : 0xf02e
  19. }]
  20.  
  21. }, {
  22. text : '合同管理',
  23. expanded : true,
  24. items : [{
  25. text : '项目合同',
  26. module : 'Agreement',
  27. glyph : 0xf02d
  28. }, {
  29. text : '合同付款计划',
  30. module : 'AgreementPlan',
  31. glyph : 0xf03a
  32. }, {
  33. text : '合同请款单',
  34. module : 'Payment',
  35. glyph : 0xf022
  36. }, {
  37. text : '合同付款单',
  38. module : 'Payout',
  39. glyph : 0xf0d6
  40. }, {
  41. text : '合同发票',
  42. module : 'Invoice',
  43. glyph : 0xf0a0
  44. }]
  45. }, {
  46. text : '综合查询',
  47. glyph : 0xf0ce,
  48. expanded : true,
  49. items : [{
  50. text : '项目合同台帐',
  51. module : 'Agreement',
  52. glyph : 0xf02d
  53. }, {
  54. text : '合同付款计划台帐',
  55. module : 'AgreementPlan',
  56. glyph : 0xf03a
  57. }, {
  58. text : '合同请款单台帐',
  59. module : 'Payment',
  60. glyph : 0xf022
  61. }, {
  62. text : '合同付款单台帐',
  63. module : 'Payout',
  64. glyph : 0xf0d6
  65. }, {
  66. text : '合同发票台帐',
  67. module : 'Invoice',
  68. glyph : 0xf0a0
  69. }]
  70.  
  71. }
  72.  
  73. ]

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

  1. // 根据data.systemMenu生成菜单条和菜单按钮下面使用的菜单数据
  2. getMenus : function() {
  3. var items = [];
  4. var menuData = this.get('systemMenu'); // 取得定义好的菜单数据
  5. Ext.Array.each(menuData, function(group) { // 遍历菜单项的数组
  6. var submenu = [];
  7. // 对每一个菜单项,遍历菜单条的数组
  8. Ext.Array.each(group.items, function(menuitem) {
  9. submenu.push({
  10. mainmenu : 'true',
  11. moduleName : menuitem.module,
  12. text : menuitem.text,
  13. icon : menuitem.icon,
  14. glyph : menuitem.glyph,
  15. handler : 'onMainMenuClick' // MainController中的事件处理程序
  16. })
  17. })
  18. var item = {
  19. text : group.text,
  20. menu : submenu,
  21. icon : group.icon,
  22. glyph : group.glyph
  23. };
  24. items.push(item);
  25. })
  26. return items;
  27. }

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

  1. /**
  2. * 系统的主菜单条,根据MainModel中的数据来生成,可以切换至按钮菜单,菜单树
  3. */
  4. Ext.define('app.view.main.region.MainMenuToolbar', {
  5. extend : 'Ext.toolbar.Toolbar',
  6. alias : 'widget.mainmenutoolbar',
  7.  
  8. defaults : {
  9. xtype : 'buttontransparent'
  10. },
  11.  
  12. items : [{
  13. glyph : 0xf100,
  14. tooltip : '在左边栏中显示树状菜单', // 几种菜单样式切换的按钮
  15. disableMouseOver : true,
  16. margin : '0 -5 0 0'
  17. }, {
  18. glyph : 0xf102,
  19. tooltip : '在顶部区域显示菜单',// 几种菜单样式切换的按钮
  20. disableMouseOver : true
  21. }],
  22.  
  23. viewModel : 'main', // 指定viewModel为main
  24.  
  25. initComponent : function() {
  26.  
  27. // 把ViewModel中生成的菜单items加到此toolbar的items中
  28. this.items = this.items.concat(this.getViewModel().getMenus());
  29.  
  30. this.callParent();
  31. }
  32. });

至此菜单条控件制作完成,下面要把其加入到Main的界面之中。首先在Main.js的uses之中引入

  1. items : [{
  2. xtype : 'maintop',
  3. region : 'north' // 把他放在最顶上
  4. }, {
  5. xtype : 'mainmenutoolbar',
  6. region : 'north' // 把他放在maintop的下面
  7. }, {
  8. xtype : 'mainbottom',
  9. region : 'south' // 把他放在最底下
  10. }, {
  11. region : 'center', // 中间面版
  12. xtype : 'maincenter'
  13. }]

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

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

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

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

ExtJS5_自定义菜单1的更多相关文章

  1. ExtJS5_自定义菜单2

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

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(74)-微信公众平台开发-自定义菜单

    系列目录 引言 1.如果不借用Senparc.Weixin SDK自定义菜单,编码起来,工作量是非常之大 2.但是借助SDK似乎一切都是简单得不要不要的 3.自定义菜单无需要建立数据库表 4.自定义菜 ...

  3. 用c#开发微信(5)自定义菜单设置工具 (在线创建)

    读目录 1 使用 2 原理 3. 错误 上次写了<用c#开发微信 (4) 基于Senparc.Weixin框架的接收事件推送处理 (源码下载)>,有园友问到如何创建菜单的问题,今天就介绍下 ...

  4. 《C#微信开发系列(2)-自定义菜单管理》

    2.0自定义菜单管理 ①接口说明 微信服务号聊天窗口下面的菜单项(有的公众号有启用有的则没有),这个可以在编辑模式简单配置,也可以在开发模式代码配置.微信公众平台开发者文档:微信公众号开发平台创建自定 ...

  5. 微信公众平台自定义菜单新增扫一扫、发图片、发位置 LBS运作更便捷

    今天微信公众平台发布更新,自定义菜单新增扫一扫.发图片.发送位置等功能,这对于有意挖掘微信LBS服务的运营者来说更便捷了,订阅号不用返回微信界面就能扫图.发送图片.调用地理位置,用户体验更友好,自然也 ...

  6. C#/ASP.NET MVC微信公众号接口开发之从零开发(四) 微信自定义菜单(附源码)

    C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...

  7. 微信公众平台创建自定义菜单中文编码导致system error

    创建包含了中文的自定义菜单时总是返回{"errcode":-1,"errmsg":"system error"},要将编码方式设置为UTF- ...

  8. 使用knockout-sortable实现对自定义菜单的拖拽排序

    在开始之前,照例,我们先看效果和功能实现. 关于自定义菜单的实现,这里就不多说了,需要了解的请访问:http://www.cnblogs.com/codelove/p/4838766.html 这里需 ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作 ...

随机推荐

  1. 使用MyEclipse实现简单的Servlet程序

    1. 创建一个继承于GenericServlet的类 3. 重写Server方法 package cn.school; import java.io.IOException; import javax ...

  2. greenplum和postgresql

    想着要不要写,两个原因"懒"和"空".其实懒和空也是有联系的,不是因为懒的写,而是因为对PostgreSQL和Npgsql的知识了解匮乏,也就懒得写.好了,开头 ...

  3. iframe页面改动parent页面的隐藏input部件value值,不能触发change事件。

    实现一个依据iframe页面返回充值卡类型不同,安排不同的input部件. 点击选择弹出一个iframe.点击充值卡数据行.返回1.充值卡类型.2.充值卡id(用的UUID).3.充值卡号(字符串). ...

  4. ALS数学点滴

    其中,$n_{u_i}$表示用户$i$评分的电影数目,$n_{m_j}$表示对电影$j$评分的用户数目.设$I_i$表示用户$i$所评分的电影集合,则$n_{u_i}$是$I_i$的基数,同样的,$I ...

  5. linux下ssh免密登陆

    如果 有A.B两台主机: 要实现的效果: A主机ssh登录B主机无需输入password: 加密方式选 rsa|dsa均能够.默认rsa 做法: 1.登录A主机 2.ssh-keygen -t [rs ...

  6. 根据IP地址获取IP的详细信息

    <?php header('Content-Type:text/html; charset=utf-8'); function ip_data() { $ip = GetIP(); $url = ...

  7. 非空验证(源代码Java版)

    import java.util.Map; /** * 非空验证工具类 */ public class UntilEmpty { /** * @see: 验证string类型的是否为空 */ publ ...

  8. 2015 Multi-University Training Contest 2

    附上第二场比赛的链接 从5300-5309 我是链接 顺便贴出官方题解:

  9. 生成package.json和bower.json

    1.安装nodejs 2.安装bower工具   cmd:npm bower install 3.生成package.json  cmd:npm init 4.生成bower.json cmd:bow ...

  10. JavaScript—window对象使用

    window对象是JavaScript浏览器对象模型中的顶层对象,包含多个常用方法和属性: 1. 打开新窗口 window.open(pageURL,name,parameters) 其中:pageU ...