ExtJs4.0 MVC模式动态加载
来源:互联网 发布:最省电的软件下载 编辑:程序博客网 时间:2024/06/05 23:51
刚刚进公司,经理要我学习ExtJs,一直看不是我一贯的作风,所以就找点例子自己做做。
用了几个星期的度娘,google,终于还是有点收获的。自己用ExtJs4.0基于MVC模式做了一个小小的列子。
列子里面的数据并没有和数据库交互,只是在后台模拟了数据。编程工具用的是EasyEclipse,废话不多说。直接进正题。
都说无图无真相,先来几张图
这个就是基本的文件包名,基本按照MVC模式:
文件夹controller(控制器)看见名字就知道,是拿来控制的。但是控制什么的呢?我的理解就是处理用户的一些响应
文件夹model(模型)与文件夹store(存储)这2个是结合在一起的,是用来管理数据的。个人理解model里面放的就是实体类
store里面有model属性来指明对应的实体类。然后通过ajax与后台交互返回json格式的数据,从而存储的一个数据对象。
文件夹view(视图)这就是一个显示数据的。
接着来一张我们最后要做成的样子图片
大概的排版就是
上面一个头head.js
中间分成2块,左边一个菜单导航menu.js,右边一个视图显示view.js
下面一个脚foot.js。
如图所示:导航里面是一个tree.对于tree来说我们就要用到所谓的动态加载了。tree下面又有子菜单。基于全动态加载。子菜单我也是用的动态加载
即你点击上图的合同管理然后才会加载合同管理的子菜单,点击合同管理的子菜单在动态加载子菜单对应的面板,然后把对应的面板加到view视图显示上。
当然我们用的也是动态加载。来张图就知道了。
下图是我刚刚启动项目时浏览器所加载的JS
由图不难看出来很多的js都没有加载我这个项目有17个JS,但是加载的Js只有8个。导进来的js没有算在里面。
接来下上代码(注意好路径):
HTML页面
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><link rel="stylesheet" type="text/css" href="ext-4.0/resources/css/ext-all.css"/><script type="text/javascript" src="ext-4.0/ext-all-debug.js"></script><script type="text/javascript" src="app.js"></script><title>E-Platform</title></head><body></body></html>
app.js
Ext.Loader.setConfig({//动态加载enabled:true});Ext.application({name:'EPF',//这个name的意思是将 工程名/app ==EPFautoCreateViewport: true,//设置这个意思就是由我自己创建Viewport.js,如果设置为false则系统会帮你创建,具体啥子可以百度appFolder:'app',//这个就是系统扫描app文件夹下的js文件controllers:['Menus'//控制器],/* * 下面的就是关键了,动态加载控制器.我也是找度娘,在网上查到的 */launch :function(){this.controllers.addListener('add',this.newControllerAdded,this);//帮控制器增加一个事件},newControllerAdded:function(idx, ctrlr, token){ ctrlr.init(); //控制器初始化 }});
Viewport.js
Ext.define('EPF.view.Viewport',{//注意名字extend:'Ext.Viewport',layout: 'fit',hideBorders: true,requires:['EPF.view.Head','EPF.view.Menu','EPF.view.View'],initComponent : function(){Ext.apply(this,{items:[{id:'desk',layout: 'border',items:[Ext.create('EPF.view.Head'),Ext.create('EPF.view.Menu'),Ext.create('EPF.view.View')]}]});this.callParent(arguments);//这个里面没什么好解释的就最后这一个。具体啥意思不记得了。反正所有跟视图有关的都加上他就可以了}})
Head.js
Ext.define('EPF.view.Head',{extend:'Ext.Component',initComponent:function(){Ext.applyIf(this,{xtype:'box',cls:'header',region:'north',html:'<h1> 放张图片</h1>',height: 30});this.callParent(arguments);}})
View.js
Ext.define('EPF.view.View',{ extend: 'Ext.tab.Panel', initComponent : function(){ Ext.apply(this,{ id: 'content-panel', //id很重要,后面点击子菜单添加panel要用到 region: 'center', //这个center也很重要,因为我的布局是border,所以一定要指定center。具体查API defaults: { autoScroll:true, bodyPadding: 0 }, activeTab: 0, border: false, items: [{ id: 'HomePage', title: '首页', iconCls:'home', layout: 'fit' }] }); this.callParent(arguments); }})
Menu.js
Ext.define('EPF.view.Menu',{extend:'Ext.panel.Panel',layout:'accordion',requires:['EPF.view.menus.PersonTree','EPF.view.menus.FinanceTree'],initComponent : function(){Ext.apply(this,{id:'menu-panel',title:'导航界面',iconCls:'icon-menu',margins:'0 0 -1 1',region :'west',border:false,enableDD:false,split:true,width:212,minSize:130,maxSize:300,rootVisible:false,containerScroll : true, collapsible : true,//可折叠 autoScroll: false,items:[//下面下个就是我创建的2个可折叠的panelExt.create('EPF.view.menus.FinanceTree'),Ext.create('EPF.view.menus.PersonTree')]});this.callParent(arguments);}})
PersonTree.js
Ext.define('EPF.view.menus.PersonTree',{extend:'Ext.tree.Panel',//alias 别名alias:'widget.persontreemenu',initComponent: function(){Ext.apply(this,{title: '人事管理', iconCls:'icon-menu',margins:'0 0 -1 1',border:false,enableDD:false,split:true,width:212,minSize:130,maxSize:300,rootVisible:false,containerScroll : true, collapsible : true, autoScroll: false, //store数据来源 store:Ext.create('EPF.store.PersonTreeMenus')});this.callParent(arguments);}})
FinanceTree.js
Ext.define('EPF.view.menus.FinanceTree',{extend:'Ext.tree.Panel',alias:'widget.financetreemenu',initComponent: function(){Ext.apply(this,{title: '财务管理', iconCls:'icon-menu',margins:'0 0 -1 1',border:false,enableDD:false,split:true,width:212,minSize:130,maxSize:300,rootVisible:false,containerScroll : true, collapsible : true, autoScroll: false, store:Ext.create('EPF.store.FinanceTreeMenus')});this.callParent(arguments);}})
Menus.js
Ext.define('EPF.controller.Menus',{extend:'Ext.app.Controller',refs:[//别名的用处通过别名知道对应的视图,视图对应方法 {ref: 'persontreemenu',selector: 'persontreemenu'}, {ref: 'financetreemenu',selector:'financetreemenu'} ],init: function(){ this.control({ 'persontreemenu': { //鼠标点击调用方法 itemmousedown: this.loadMenu }, 'financetreemenu': { itemmousedown: this.loadMenu } })},loadMenu:function(selModel, record){if(record.get('leaf')){//判断是否存在子节点,如果没有子节点就走下面//有子节点就是把子节点显示var panel = Ext.getCmp(record.get('id'));//通过id得到panel,判断panel有没有打开 if(!panel){ //不存在 var path; Ext.Ajax.request({ //发送ajax请求后台传一个id给后台。表示我现在点击的是哪一个叶子节点 waitMsg: '努力加载中...', params:{ //参数id id : record.get('id') }, async : false,//关键只有加这个才可以把ajax返回值赋给变量,外面才可以使用。 url:'PanelToView', success : function(response){ path = Ext.JSON.decode(response.responseText)[0].text; //把返回值赋给path我这后台模拟传出来的是EPF.view.panel.PersonalImformation } }); //下面重点,动态加载控制器 //1得到控制器,这个控制器对应的哪个panel this.getController('PersonalImformation'); //创建一个模板panel设置标题,还有可关闭 var modelPanel ={ title:record.get('text'), closable:true }; //下面这个是百度来的,api中说过Ext.create这个方法也是一个别名创建 //大家想想,既然Ext.create都是动态来实现的,我们只要了解他的实现原理,就可以依葫芦画瓢 //下面的意思就是我指定了一个path,还有一个模板,动态创建了一个panel panel = Ext.create(path,modelPanel);//调用openTab方法 this.openTab(panel,record.get('id')); }else{ //如果存在,让panel得到焦点 var main = Ext.getCmp("content-panel"); main.setActiveTab(panel); }}}, openTab : function (panel,id){ var o = (typeof panel == "string" ? panel : id || panel.id); var main = Ext.getCmp("content-panel"); var tab = main.getComponent(o); if (tab) { main.setActiveTab(tab); } else if(typeof panel!="string"){ panel.id = o; tab = main.add(panel); main.setActiveTab(tab); } }});
我这个子节点打开的里面是一个分页的table,在table上又加了一个双击事件,就是上面代码中新加载的控制器
PersonlInformation.js
Ext.define('EPF.view.panel.PersonalImformation',{extend:'Ext.grid.Panel',alias:'widget.personalimformation',requires :[ 'Ext.toolbar.Paging'],initComponent: function(){var store = Ext.create('EPF.store.PerImformation');Ext.apply(this,{ store: store, disableSelection: true, loadMask: true, columns:[ {text:'姓名',width:120,dataIndex:'name',sortable:true}, {text:'性别',width:120,dataIndex:'sex',sortable:true}, {text:'年龄',width:120,dataIndex:'age',sortable:true} ], bbar: Ext.create('Ext.PagingToolbar', { store: store, displayInfo: true, displayMsg: 'Displaying topics {0} - {1} of {2}', emptyMsg: "No topics to display" })});this.callParent(arguments);}})
大概代码就这么点.其他的太多了.稍后我会直接上传
代码下载地址(赚点可怜分)http://download.csdn.net/detail/xq5236870/5052758
- ExtJs4.0 MVC模式动态加载
- extjs4 mvc 动态加载controller
- extjs4 MVC 多控制器 动态加载
- ExtJs4 MVC 提高加载速度 动态加载Controller
- ExtJs4 MVC 提高加载速度 动态加载Controller
- Extjs4.2 TreePanel+Asp.net mvc 动态加载节点
- ExtJs4问题笔记(二) Mvc模式Controller按需加载
- EXTJS4.0MVC模式导航栏制作
- EXTJS4 MVC模式笔记
- extjs4.0 动态异步加载节点数据
- extjs4.0 动态异步加载节点数据
- ExtJs4 动态加载js
- extjs4 动态加载树
- ExtJs4 动态加载
- ExtJS4的MVC模式实例
- ExtJS4的MVC模式实例
- Extjs4 动态加载(Ext.Loader)
- ExtJs4 动态加载(Ext.Loader)
- (3)聚簇因子(CLUSTERING_FACTOR )——上
- [转]C++ static、const和static const 以及它们的初始化
- fusioncharts错误提示的汉化,基本故障排除,下载功能配置
- 第62章、XML文件-DOM操作(从零开始学Android)
- 其它
- ExtJs4.0 MVC模式动态加载
- Unity3D AssetStore下载的文件保存位置
- 对IOS设备中UDID的一些思考
- QT一个简易画板实现
- CDHtmlDialog探索----WebBrowser扩展和网页Javascript错误处理
- 第66章、使用SQLite本地数据库(从零开始学Android)
- Accessing iPhone Call History(读取iPhone通话记录)
- WebForm 打印功能代码
- 流形学习研究综述