开发环境

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的更多相关文章

  1. ExtJS MVC学习手记

    开始学习ExtJS的MVC了.这篇文章仅是用来做一个目录,为自己这个阶段的学习内容做个索引. 手记涉及的文章: EXTJS MVC结构(译自ExtJS4.0文档中的<MVC Architectu ...

  2. ExtJS MVC 学习手记3

    在演示应用中,我们已经创建好了viewport,并为之添加了一个菜单树.但也仅仅是这样,点击树或应用的其他地方获得不到任何响应.这个演示应用还是一个死的应用. 接下来,我们让这个应用活起来. 首先,给 ...

  3. ExtJS MVC学习手记 1

    开发环境: ExtJS4.2 eclipse indigo 开发目标  搭建项目框架,创建viewport 开发步骤说明 这次主要使用extjs4的mvc模式创建viewport.籍此初步了解mvc模 ...

  4. Extjs MVC学习随笔01

    Extjs Mvc模式下的整个MVC框架体系即下图: 包含了Controller(实现方法层),Store(数据来源管理层),View(页面布局层).之所以用MVC我想是因为减轻针对某一页面的单一的J ...

  5. Linux.NET学习手记(7)

    前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...

  6. Linux.NET学习手记(8)

    上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...

  7. EF框架学习手记

    转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...

  8. Extjs MVC模式开发,循序渐进(一)

    本文讲述extjs mvc的Helloworld,tabPanel,event,页面布局layout等内容. 本页包含:MVC模式案例(一)~MVC模式案例(六),从搭建extjs mvc到点击按钮生 ...

  9. .NET MVC 学习笔记(二)— Bootstrap框架

    二..NET MVC 学习笔记(一)—— Bootstrap框架 在实际开发过程中,页面的样式问题是让人很头疼的问题,良好的用户界面可以大大提高用户体检,而在你没有前端开发人员的火力支援情况下,并不是 ...

随机推荐

  1. JS 点击按钮后弹出遮罩层,有关闭按钮

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  2. 处理程序“WebServiceHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    开发web项目时需要安装IIS,在安装好IIS的Windows7本上发布asp.net网站时,web程序已经映射到了本地IIS上,但运行如下错误提示“处理程序“PageHandlerFactory-I ...

  3. Boost C++: 网络编程1

    #include <iostream> #include <boost/asio.hpp> #include <boost/config/compiler/visualc ...

  4. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  5. Linux日志

    一.Linux 常見的日志文件 /var/log/cron:你的 crontab 排程有没有实际被进行? 进行过程有没有发生错误?你的 /etc/crontab 是否撰写正确?在这个登录档内查询看看. ...

  6. 【转载】UML用例图

    用例图主要用来描述“用户.需求.系统功能单元”之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. [用途]:帮助开发团队以一种可视化的方式理解系统的功能需求. 用例图所包含的元素如下: 1. ...

  7. 搭建高性能计算环境(九)、应用软件的安装之gaussian 09

    高斯软件一般使用的都是编译好的二进制版,所以解压缩后设置一下环境变量就可以用了. cd /opt tar xvf g09.tar.gz 设置环境变量,添加到/etc/profile文件中,重新登录后生 ...

  8. 前端代码优化: 使用YUI Compressor

    通过压缩组件,可以显著减少HTTP请求和响应事件.这也是减小页面大小最简单的技术,但也是效果最明显的. 压缩JS,CSS代码有几种常用插件,YUI Compressor是个不错的选择.通过maven的 ...

  9. UI Button

    iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...

  10. Outlook 2007无法打开链接"由于本机的限制 该操作已被取消"

    编写人:CC阿爸 2014-2-17 近来在日常维护中,经常性的遇到用户在outlook中打开链接,提示[由于本机的限制,该操作已被取消],第一次的在网上搜索到解决办法后, 第二次再处理时,又没能记住 ...