Ext JS 4 採用 MVC 架構,預設啟動時一次載入所有 Controller/View/Store,導致首頁載入緩慢。企業級應用常有數十個功能模組,需實現單一 Application 實例下,點擊選單才動態載入對應模組 (Controller 為入口,View/Store 隨之載入)。
Ext.application 只能建立一次,二次建立會覆蓋導致事件失效。init、onLaunch 生命週期。Ext.Loader 依名稱解析路徑,需遵循命名慣例。Ext.Loader.setConfig({ enabled: true });
Ext.require(['Ext.app.Application', 'Ext.app.Controller']);
// 擴充 Controller:提供掛載點
Ext.app.Controller.implement({
loadModel: function() {}, // 子類別覆寫載入 Models
loadView: function() {}, // 子類別覆寫載入 Views
getApplication: function() { return this.application; }
});
// 擴充 Application:核心動態載入邏輯
Ext.app.Application.implement({
loadModule: function(controllers) {
var me = this;
controllers = Ext.Array.from(controllers);
Ext.each(controllers, function(name) {
if (!me.controllers.containsKey(name)) {
// 1. 建立 Controller 實例
var controller = Ext.create(
me.getModuleClassName(name, 'controller'),
{ application: me, id: name }
);
me.controllers.add(controller);
// 2. 執行生命週期
controller.loadModel(); // 優先載入 Model
controller.init(me); // 初始化 (綁定事件等)
controller.onLaunch(me); // 啟動後邏輯
controller.loadView(); // 動態建構 View 並綁定資料
}
});
}
});
app/
controller/
Org.js // 組織架構模組 Controller
User.js
view/
org/
OrgTree.js
OrgUserGrid.js
user/
UserList.js
store/
OrgStore.js
UserStore.js
model/
OrgModel.js
UserModel.js
Ext.define('MyApp.controller.Org', {
extend: 'Ext.app.Controller',
models: ['OrgModel'],
stores: ['OrgStore'],
views: ['org.OrgTree', 'org.OrgUserGrid'],
loadModel: function() {
this.getModel('OrgModel'); // 觸發載入
},
loadView: function() {
// 視圖已在 views 陣列宣告,Ext.Loader 會自動載入
// 若需動態建構實例,可在這裡 create 並加入容器
},
init: function(app) {
this.control({
'orgtree': { itemclick: this.onOrgTreeClick },
'orgusergrid': { itemdblclick: this.onUserDblClick }
});
},
onOrgTreeClick: function(view, record) {
var store = this.getOrgStoreStore();
store.load({ params: { orgId: record.get('id') } });
}
});
// 主入口 app.js
Ext.application({
name: 'MyApp',
appFolder: 'app',
controllers: [], // 初始不載入任何模組
launch: function() {
window.application = this; // 掛載全域變數供頁面呼叫
// 建立主框架 (Viewport, TreePanel 選單等)
}
});
// 頁面 (Razor/WebForm) 切換到「組織架構」模組
<script>
application.loadModule("Org"); // 動態載入 Org Controller 及其相依
var main = Ext.create('Ext.panel.Panel', {
layout: 'border',
items: [
{ xtype: 'orgtree', region: 'west', width: 250 },
{ xtype: 'orgusergrid', region: 'center' }
]
});
Global.ExtTabDoLayout(main); // 加入主 TabPanel
</script>
loadModel → init → onLaunch → loadView 符合 Ext JS 設計預期。Ext JS 6+ 內建Ext.app.ViewController、Ext.app.ViewModel(MVVM) 並支援Ext.mixin.Bindable,動態載入機制更成熟 (可用Ext.require+Ext.create)。本文模式適用於 4.x/5.x 維護專案,新專案建議直接採用 Modern Toolkit + MVVM 架構。