Extjs4.1.x 框架搭建 采用Application动态按需加载MVC各模块
我们知道Extjs4之后提出了MVC模块开发,将以前肥厚的js文件拆分成小的js模块[model\view\controller\store\form\data等],通过controller拼接黏合,提高了js代码的重用性,可阅读性,更加适合团队的开发。
js采用mvc后必定会带来一个问题,如何高效的加载各个js小文件?
官方的例子是统一采用了一个Ext.Application入口:
Ext.application({ name: 'WMS', appFolder: 'ExtJs/App', autoCreateViewport:true, controllers: [ 'controller1','controller2','controller3' ], launch: function() { // } });
由于一个应用程序只有一个入口也就是一个application,这样会带来一个问题,我一个项目有众多的controller文件,需要在系统启动的时候加载所有的js文件,这明显不是我们想要的,我们想按需加载,在页面呈现的时候按需加载js各个模块文件。
看下面的框架例子,说的直白一点也就是我单击功能菜单树的“组织架构”,打开新的tab页面的时候,再加载所需要的js文件。
由于tab页面加载不是采用iframe的方式,这样就会带来更多的问题,毕竟他是和整个框架式一体的,需要考虑的问题不少。好处也很明显,不用每次都加载必备的Extjs库文件等。
//tab页面加载方法 NodeClick: function (view, record) { if (record.data.leaf == true) { var panel = Ext.getCmp(record.id); if (!panel) { panel = { id: record.id, closable: true, title: record.data.text, iconCls: record.data.iconCls, autoScroll: true, border: false, layout: 'fit', autoLoad: {//采用autoload方式 url: record.data.url, scope: this, scripts: true, text: '页面加载中,请稍候....' } }; this.openTab(panel, record.id); } else { var main = Ext.getCmp("ViewPortCoreTab"); main.setActiveTab(panel); } } }, openTab: function (panel, id) { var o = (typeof panel == "string" ? panel : id || panel.id); var main = Ext.getCmp("ViewPortCoreTab"); var tab = main.getComponent(o); if (tab) { main.setActiveTab(tab); } else if (typeof panel != "string") { panel.id = o; var p = main.add(panel); main.setActiveTab(p); } },
言归正传,还是那个问题,动态加载tab里的js模块文件,看了下面这个老兄的文章,解决了大问题。
http://www.nnwnn.com/a/bianchengjiaocheng/2012/0920/17461.html
首先“组织架构”页面的内容,我暂时采用官方的user demo代替,目录架构如下:
在组织架构页面的写法如下(没有整理,单独归档js)
@{ ViewBag.Title = "组织架构管理"; } <script> Ext.define('Module.UserModule', { extend: 'Ext.app.Application', id:"Org", name: 'AM', appFolder: '/ExtJs/App', controllers: ["Users"], launch: function () { } }); Ext.require("Module.UserModule", function () { var app = Ext.create('Module.UserModule'); //需求创建user办理模块的app Ext.onReady(function () { //必需要等user办理模块的app创建完成后才执行 var main = new Ext.Panel({ border: false, layout: 'fit', items: [{ xtype: 'userlist' }] }); //autoload方式,需要添加到tab,否则默认会是整个viewport,那就坏事喽 Global.ExtTabDoLayout(main); }); }); </script>
好了,到目前为止,解决了按需加载js模块的方法。
但是新的问题又来了[ExtJs这玩意真的是很痛苦,几度放弃的边缘],引入了新的application后,页面的原始事件被刷新掉了,不管用了,估计是
init: function () { this.control({//这里导致我整个框架的单击树节点的事件没有了(估计是this的问题) 'panel > userlist dataview': { itemdblclick: this.editUser }, 'useredit button[action=save]': { click: this.updateUser } }); },
继续研究中....
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架