`
dowhathowtodo
  • 浏览: 774923 次
文章分类
社区版块
存档分类
最新评论

ExtJS4开发笔记(六)——菜单的实现

 
阅读更多

上篇文章介绍了搭建一个空的框架,使得管理系统有了大致的模样,今天工作的主要内容就是菜单的实现以及点击菜单后在右边内容区打开一个新的Panel。本篇文章的内容主要包括两个方面,Extjs4 Tree及Extjs4 tabPanel。

在Extjs应用中实现菜单,无疑Tree是最好的选择,将菜单项直接写到Tree中,也未尝不可,但后期的维护会非常麻烦,那么最好的选择就是异步获取菜单节点,这样既有利于后期维护,也可以节省JS代码的编写量。

实现异步加载,那必须要有数据库和服务端程序。管理系统使用的是ACCESS数据库。在数据库中建立Menu表,表一共有4个字段,分别是ID、MenuName、ParentID和cls.

ID:自增长类型

MenuName:代表菜单的名字。ParentID

ParentID:父ID

cls:样式名(这个需要在样式表中体现出来,才会有效果)

数据库有了,接下来就是服务端的编写,其实JS框架的好处在于服务端无论用什么都可以,这里我就使用ASP来实现了。由于服务端涉及的方面比较多,较多代码帖出来会比较乱,这里只说下返回的形式。

菜单需要的JSON数据格式如下:

  1. [{"text":"管理员管理","id":"1","iconCls":"manage","leaf":true}]

这里注意一点:由于整棵菜单树都是异步获取的,所以节点并不需要递归,而树的node.id就是JSON数据中的ID。点击父节点展开子节点的时候,发送的数据也是node.id,这样正好解决获取子节点的问题。所有根节点的ParentID都为0。那么第一次加载菜单的时候,正好可以获取所有的根节点了。

重点,菜单树的数据源编写,根据MVC原则,在app目录下建立store文件夹,这个文件夹下放置所有的获取数据的js文件,在store文件夹下建立Menus.js,编写如下代码:

  1. Ext.define('SMS.store.Menus',{
  2. extend:'Ext.data.TreeStore',
  3. root:{
  4. expanded:true
  5. },
  6. proxy:{
  7. type:'ajax',
  8. url:'/server/MenuLoader.asp'
  9. }

  10. })

然后修改view文件夹下的Menu.js文件:

  1. Ext.define('SMS.view.Menu',{
  2. extend:'Ext.tree.Panel',
  3. alias:'widget.smsmenu',
  4. requires:['SMS.store.Menus'],
  5. initComponent:function(){
  6. Ext.apply(this,{
  7. id:'menu-panel',
  8. title:'系统菜单',
  9. iconCls:'icon-menu',
  10. margins:'00-11',
  11. region:'west',
  12. border:false,
  13. enableDD:false,
  14. split:true,
  15. width:212,
  16. minSize:130,
  17. maxSize:300,
  18. rootVisible:false,
  19. containerScroll:true,
  20. collapsible:true,
  21. autoScroll:false,
  22. store:Ext.create('SMS.store.Menus'),
  23. });
  24. this.callParent(arguments);
  25. }
  26. })

如此,当页面打开时,就会自动加载菜单项了。但是目前来说,点击菜单的任何节点都没有任何作用,那么由于整个项目都要使用Extjs来完成,那么必须要实现点击节点在右边内容区显示相应的Grid或Panel等等。下面,我们编写代码实现这个功能。

原理:当点击菜单树的节点时,先要判断要打开的组件是否存在,如果存在,则在右边内容区激活当前组件,如果不存在,则创建一个组件,然后在右边内容区增加一个组件。当然。这里为了通用性更高,创建出的组件一律按panel为准。为了实现在右边内容区的tabPanel上增加或删除对应的table,根据分离原则,我们需要在控制器上完成该操作,接下来,我们在controller文件夹下建立Menu.js文件,Menu.js会完成这一系列的工作,具体代码如下:

  1. Ext.define('SMS.controller.Menu',{
  2. extend:'Ext.app.Controller',
  3. refs:[
  4. {ref:'smsmenu',selector:'smstablepanel'},
  5. {ref:'tabPanel',selector:'smstablepanel'}
  6. ],
  7. init:function(){
  8. this.control({
  9. 'smsmenu':{
  10. itemmousedown:this.loadMenu
  11. }
  12. })
  13. },
  14. loadMenu:function(selModel,record){
  15. if(record.get('leaf')){
  16. varpanel=Ext.getCmp(record.get('id'));
  17. if(!panel){
  18. panel={
  19. title:'NewTab'+record.get('id'),
  20. iconCls:'tabs',
  21. html:'TabBody'+record.get('id')+'<br/><br/>',
  22. closable:true
  23. }
  24. this.openTab(panel,record.get('id'));
  25. }else{
  26. varmain=Ext.getCmp("content-panel");
  27. main.setActiveTab(panel);
  28. }
  29. }

  30. },
  31. openTab:function(panel,id){
  32. varo=(typeofpanel=="string"?panel:id||panel.id);
  33. varmain=Ext.getCmp("content-panel");
  34. vartab=main.getComponent(o);
  35. if(tab){
  36. main.setActiveTab(tab);
  37. }elseif(typeofpanel!="string"){
  38. panel.id=o;
  39. varp=main.add(panel);
  40. main.setActiveTab(p);
  41. }
  42. }

  43. })

关键点:refs和this.control,refs在官方API中没有找到其解释,网上查了下,对该属性的解释是:凡是component都可以使用该属性在它的归属容器及归属容器的父节点中注入一个对该属性的引用名称。有了该引用名,和该组件有共同父节点的组件就可以比较方便的引用该组件。

而this.control则很容易理解了,即通过Ext.ComponentQuery为选定的组件添加监听。上面代码为我们的菜单节点添加了一个事件loadMenu,loadMenu中,先获取对应的panel,如果该panel不存在,则使用openTab方法在内容区的tabPanel上增加一个panel,如果存在,则激活该panel。而panel不存在的话,这里只简单的创建了一个panel,并没有任何意义,下篇文章,我们将详细讨论这个问题。

最后,我们需要修改app.js,将我们创建的控制器加载进来。app.js:

  1. Ext.Loader.setConfig({enabled:true});
  2. Ext.application({
  3. name:'SMS',
  4. appFolder:'app',
  5. autoCreateViewport:true,
  6. controllers:[
  7. 'Menu'
  8. ]
  9. });

这里唯一修改的地方就是将Main改为了Menu。后面,我们会逐步完善。

今天的工作比较多,整理下今日的工作内容:

1、在app目录下建立了store文件夹,并建立了Menus.js文件,这个文件负责菜单数据的加载。

2、修改了view文件夹下的Menu.js,使其可以加载菜单数据。

3、在controller文件夹下建立了Menu.js,使其可以在内容区的tabPanel上增加新的panel组件。

4、修改app.js,使其可以使菜单项正常使用。


分享到:
评论

相关推荐

    ExtJS4中文教程2 开发笔记 chm

    Extjs4开发笔记(三)——菜单的实现 Extjs4开发笔记(二)——框架的搭建 Extjs4开发笔记(五)——动态grid Extjs4开发笔记(四)——实现登录功能 Extjs4开发笔记(一)——准备工作 关于Extjs4开发笔记(二)的补充说明 ...

    EXTJS4自学手册

    EXTJS4自学手册——EXT文件目录,本地加载文档,命名规范 EXTJS4自学手册——EXT基本方法、属性(onReady、define、create) EXTJS4自学手册——EXT基本方法、属性(apply、applyIf、constructor) EXTJS4自学手册...

    Extjs4开发笔记(收集整理).pdf

    Extjs4开发笔记,自己学习Extjs4的一些心得体会和小技巧

    ExtJS4.0开发笔记

    ExtJS4.0开发笔记

    Extjs4.0学习笔记

    Extjs4.0学习笔记,以下是部分介绍: xtjs4,创建Ext组件有了新的方式,就是Ext.create(....),而且可以使用动态加载JS的方式来加快组件的渲染,我们再也不必一次加载已经...ExtJS4学习笔记(十)---ExtJS4图片验证码的实现

    Extjs 4 开发笔记

    该文档详细介绍基于Extjs 4 项目的开发过程,方便初学者。

    Extjs4 MVC开发笔记源码

    Extjs4 MVC开发笔记源码,此源码已经将命名空间修改为Soyi,由于涉及到一些公司信息,将所有数据库中的数据清除,由于时间仓促。只有备案管理的grid是可以使用的,其他的功能,按照备案管理的文件照猫画虎即可实现。 ...

    extJs 2.1学习笔记

    目录 1. ExtJs 结构树 2 2. 对ExtJs的态度 3 3. Ext.form概述 4 4. Ext.TabPanel篇 5 5. Function扩展篇 7 6. Ext.data.Store篇 10 7. Ext.data.JsonReader篇一 12 ...28. extJs 2.0学习笔记(ext.js篇) 77

    基于extjs4.0.7的员工管理系统

    Extjs4开发笔记(一)——准备工作 http://www.mhzg.net/a/20116/20116281100279.html Extjs4开发笔记(二)——框架的搭建 http://www.mhzg.net/a/20116/201162913210280.html 目前仅实现这两步,我在参照原作者的...

    EXTJS4 菜单栏

    EXTJS4 菜单栏

    ExtJS4 2学习 21 动态菜单与表格数据展示操作总结篇

    ExtJS4 2学习 21 动态菜单与表格数据展示操作总结

    ExtJS4中文教程2 开发笔记

    ExtJS4中文教程2 开发笔记

    Extjs4.0开发笔记

    extjs4常用控件Window、Grid等等的用法说明,示例

    ExtJS4.0图文实例——数据组件介绍及简单应用

    ExtJS4.0图文实例——数据组件介绍及简单应用

    Extjs 5 学习笔记

    Extjs 5 学习笔记,在网上下载整理好的。

    extjs4.x学习笔记

    从开发大型的web后台或者企业管理系统来看,ExtJs3的缺陷还是比较明显的,从ExtJs4 开始引入了MVC架构,从而能够从容的组织系统的JS文件了。 从ExtJs5开始则引入了MVVC架构。 从网上资料来看,多数都是停留在ExtJs3...

    Extjs 下拉菜单实现拼音输入进行检索

    Extjs 下拉菜单实现拼音输入进行检索

    extjs4 学习笔记源码

    exjts4 学习笔记源码,源码包含windws,hbox,vbox和Grid的应用,其中grid介绍比较多。下载解压后,部署后就可以使用,所有代码均在demo文件夹下。更多extjs4教程,请关注http://www.mhzg.net

Global site tag (gtag.js) - Google Analytics