ExtJS MVC学习手记 2
开发环境
eclipse(indigo) ExtJS4.0
开发目标
使用store、model和controller创建菜单树
开发步骤
之前我们已经建立了一个MVC的项目框架。现在要做的就是在这个基础上给项目添加一个左侧菜单。
首先,在/app/中定义一个菜单视图类TreeMenu.js:
Ext.define('demo.view.TreeMenu', {
    extend: 'Ext.tree.Panel',
    alias: 'widget.treemenu',
    title: '系统菜单',
    margins: 5
});
我们定义的TreeMenu类继承了treepanel类,用于实现系统菜单。
alias表示类的别名。在我们需要使用这个类创建对象时,我们可以直接使用“xtype: ‘treemenu’”这样的方式。
然后我们在viewport中引用这个类:
Ext.define('demo.view.Viewport', {
    extend: 'Ext.container.Viewport',
    layout: 'border',
    requires: [
        'demo.view.TreeMenu'
    ],
    items: [{
        region: 'north',
        height: 65,
        html: '<div style="text-align:center; font-size:36px;">ExtJS MVC 演示</div>'
    },{
        region: 'west',
        width: 225,
        xtype: 'treemenu'
    },{
        region: 'center'
    }]
});
在viewport通过requires添加了对TreeMenu类的引用。“demo.view.TreeMenu”表示在命名空间demo下的view目录下的TreeMenu类。
之后使用xtype:’treemenu’创建了TreeMenu类的对象。
如下是演示效果:

我们现在只是创建了一个菜单树的面板。现在需要在面板中添加菜单树。
菜单树的数据从menu.json中获取:
{
    children: [{
                   text: '用户管理',
                 leaf: false,
                 expanded: true,
                   children: [{
                                   text: '角色管理',
                                   leaf: true
                               },{
                                   text: '信息管理',
                                   leaf: true
                               }]
              },{
                   text: '系统管理',
                 leaf: false,
                 expanded: true,
                   children: [{
                                   text: '数据字典管理',
                                   leaf: true
                               },{
                                   text: '日志管理',
                                   leaf: true
                               }]
              }]
}
而后使用store和model来获取数据。通常store决定获取数据的方式,model决定获取那些数据及数据样式(有时也会将获取数据的proxy置于model中),使用时通过store调用model。
这里是我们的model类MenuModel.js:
Ext.define('demo.model.MenuModel', {
    extend: 'Ext.data.Model',
    fields: ['text', 'leaf']
});
我们的store类MenuStore.js:
Ext.define("demo.store.MenuStore",{
    extend:'Ext.data.TreeStore',
    model: 'demo.model.MenuModel',
    autoLoad: true,
    proxy: {
        type:'ajax',
        url:'menu.json',
        reader: {
            type: 'json'
        }
    }
});
这里有一个属性要说明下:autoLoad,true表示store创建完成后自动加载数据。
现在我们有数据了,也设置了获取数据的方式,接下来要做的就是通知应用来取数据。这里就需要controller了。controller是粘合应用的胶水。
如下是MenuController类:
Ext.define('demo.controller.MenuController', {
    extend: 'Ext.app.Controller',
    stores: ['MenuStore'],
    model: ['MenuModel'],
    views: ['TreeMenu']
});
如果之前有看过《ExtJS MVC结构》一文的话(建议看一下,官方文档说的比较详细透彻而且有比较好的实例),可以知道在controller中引用store后,就为store创建了一个同名的storeid,我们可以在view中直接使用这个storeid。以下是修改过的TreeMenu类:
Ext.define('demo.view.TreeMenu', {
    extend: 'Ext.tree.Panel',
    alias: 'widget.treemenu',
    title: '系统菜单',
    margins: 5,
    initComponent: function() {
        Ext.apply(this, {
            store: 'MenuStore',
            rootVisible: false
        });
        this.callParent();
    }
});
修改后,我们使用apply函数为treemenu类添加属性。这个过程是写在了initComponent函数中。initComponent函数是在定义子类时用作构造器使用。顾名思义,initComponent函数在类创建时被首先调用,并且会向上一直追溯到祖先类。因此在initComponent函数中必须有callParent的调用。
不过也有人是这样做的:
Ext.define('demo.view.TreeMenu', {
    extend: 'Ext.tree.Panel',
    alias: 'widget.treemenu',
    title: '系统菜单',
    margins: 5,
    store: 'MenuStore',
    rootVisible: false
});
没有使用apply函数,显得比较简洁。这样子的做法我也试了一下,在家中测试没有成功,在公司测试成功了一次。觉得不是很稳定的一个做法。原因还没有深究,估计和js的运行顺序有关。建议还是用apply函数。在官方的实例中也是多使用apply函数。
好了,这次的目标只差临门一脚了。最后我们还要告诉app去找到controller,然后通过controller串起这个应用来,修改app.js:
Ext.application({
    name: 'demo',
    controllers:['MenuController'],
    autoCreateViewport: true
});
然后看下目前系统的文件结构:

下图是运行结果:

ExtJS MVC学习手记 2的更多相关文章
- ExtJS MVC学习手记
		开始学习ExtJS的MVC了.这篇文章仅是用来做一个目录,为自己这个阶段的学习内容做个索引. 手记涉及的文章: EXTJS MVC结构(译自ExtJS4.0文档中的<MVC Architectu ... 
- ExtJS MVC 学习手记3
		在演示应用中,我们已经创建好了viewport,并为之添加了一个菜单树.但也仅仅是这样,点击树或应用的其他地方获得不到任何响应.这个演示应用还是一个死的应用. 接下来,我们让这个应用活起来. 首先,给 ... 
- ExtJS MVC学习手记 1
		开发环境: ExtJS4.2 eclipse indigo 开发目标 搭建项目框架,创建viewport 开发步骤说明 这次主要使用extjs4的mvc模式创建viewport.籍此初步了解mvc模 ... 
- Extjs MVC学习随笔01
		Extjs Mvc模式下的整个MVC框架体系即下图: 包含了Controller(实现方法层),Store(数据来源管理层),View(页面布局层).之所以用MVC我想是因为减轻针对某一页面的单一的J ... 
- Linux.NET学习手记(7)
		前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ... 
- Linux.NET学习手记(8)
		上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ... 
- EF框架学习手记
		转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ... 
- Extjs MVC模式开发,循序渐进(一)
		本文讲述extjs mvc的Helloworld,tabPanel,event,页面布局layout等内容. 本页包含:MVC模式案例(一)~MVC模式案例(六),从搭建extjs mvc到点击按钮生 ... 
- .NET MVC 学习笔记(二)— Bootstrap框架
		二..NET MVC 学习笔记(一)—— Bootstrap框架 在实际开发过程中,页面的样式问题是让人很头疼的问题,良好的用户界面可以大大提高用户体检,而在你没有前端开发人员的火力支援情况下,并不是 ... 
随机推荐
- java基础回顾(三)——HashMap与HashTable
			public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable public cla ... 
- java根据sessionid获取session
			import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; /** * * Class ... 
- C#  发送邮件方法2
			一. 发送邮件程序:(使用System.Web.Mail下的类) "; //SMTP服务密码 strFrom = "jailu@163.com"; //发送方邮件地址 C ... 
- mysql 常用sql操作语句
			获取数据库里所有表 SELECT TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='数据库名' 获取表里 ... 
- MyBatis学习系列一之环境搭建
			目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 学习一个新的知识,首先做一个简单的例子使用一下,然后再逐步深入.MyBat ... 
- HTTP状态
			HTTP状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应 ... 
- jQuery通过jquery.form.js插件使用AJAX提交Form表单
			我简单使用了一下,jQuery Form插件有一下优点: 1.支持提交前验证. 2.支持提交后回调. 3.采用AJAX方式,有很好的用户体验 4.提交方式是灵活.只要指定要提交的form ID即可. ... 
- C#中的快捷键,可以更方便的编写代码 (转载)
			C#中的快捷键,可以更方便的编写代码 CTRL + SHIFT + B 生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O 打开项目 CTRL + ... 
- linux中的虚拟化网络模型及各种模型实现
			第一种隔离模型: Guest1和Guest2都为虚拟机. 首先要了解在linux中的虚拟机的网卡都包含前半段和后半段,前半段在虚拟机上,后半段在宿主机上,这里以centos6为例,上图 eth0为Gu ... 
- Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException:
			七月 17, 2014 4:56:01 下午 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service( ... 
