題記:研究使用ext兩個星期了,從痛苦中逐漸走向明朗。css
展現列表的子列表的數據時須要將當前的數據傳給下一個mvc。jquery
好比用戶列表,點擊一個用戶查看該用戶的日誌列表。ajax
首先是controller,放一個方法,注意showLog方法的兩個參數,還有mvcConfig參數是個人自定義參數,供下一個mvc去調用。用Ext.applation動態添加controller。chrome
Ext.define("admin.controller.collection.MembController", { extend: "Ext.app.Controller", views: ["collection.membList"], models: ["collection.MembModel"], stores: ["collection.MembStore"], init: function () { if (!Ext.getCmp('membList')) { var tab = Ext.create('custom.panelTab'); var view = Ext.create('admin.view.collection.membList'); tab.createTab(view); } else {
Ext.getCmp('membList').show(); } }, //查看日誌 showLog: function (grid, rowIndex) { var me = this; var ctrl = Ext.create('admin.controller.collection.MembController'); var record = this.getStore().getAt(rowIndex); var rowData = grid.store.data.items[rowIndex].data; //添加controller Ext.application({ extend: 'Ext.app.Application', appFolder: "app/",//文件路徑 name: 'admin', controllers: ['collection.SingleLogController'], mvcConfig: { userId: rowData.id } }); } });
在view中綁定點擊事件,這個比較基礎json
Ext.define('admin.view.collection.membList', { extend: 'Ext.grid.Panel', requires: ['mc.date'], xtype: 'grid', title: '成員管理', id: 'membList', closable: true, store: 'collection.MembStore', initComponent: function () { var me = this; var ctrl = Ext.create('admin.controller.collection.MembController'); Ext.apply(me, { columns: [ { header: '編號', dataIndex: 'id', width: 60, }, { header: '姓名', dataIndex: 'username', width: 120, }, { header: '操做', xtype: 'actioncolumn', width: 50, sortable: false, menuDisabled: true, items: [ { icon: 'resources/css/ext/images/icons/fam/user_suit.png', tooltip: '工做日誌', scope: this, handler: ctrl.showLog } ] } ] }); me.callParent(arguments); } });
接下來就是日誌的controller處理了。mvc
Ext.define('admin.controller.collection.SingleLogController', { extend: 'Ext.app.Controller', views: ['collection.memberLogList'], models: ['collection.LogModel'], stores: ['collection.SingleLogStore'], init: function () { var mvcConfig = this.getApplication().mvcConfig; //console.log('系統日誌'); if (!Ext.getCmp('memberLogList')) { var tab = Ext.create('custom.panelTab'); var view = Ext.create('admin.view.collection.memberLogList'); var store = view.getStore();
store.setProxy({ type: 'jsonp', url: ajaxConfig.member.logList,//+ "?id=" + mvcConfig.userId extraParams: {//參數 //memberId: mvcConfig.userId "params": "{member:" + mvcConfig.userId + "}" }, reader: { totalProperty: 'total', root: 'results' } }); //store.load();因爲第一次是自動加載執行,因此不須要手動載入 tab.createTab(view); } else { var view = Ext.getCmp('memberLogList'); var store = view.getStore(); store.setProxy({ type: 'jsonp', url: ajaxConfig.member.logList,//+ "?id=" + mvcConfig.userId extraParams: {//參數 //memberId: mvcConfig.userId "params": "{member:" + mvcConfig.userId + "}" }, reader: { totalProperty: 'total', root: 'results' } }); store.reload(); Ext.getCmp('memberLogList').show(); } }, });
注意自定義參數的獲取,與store對數據的控制。app
因爲Ext的mvc是按文件系統(fileSystem)化分邏輯的,因此上面的代碼段是分別放在不一樣的js文件中的,路徑和類名的對應關係注意一下。dom
再說一下Ext的機制,模塊按需加載,模塊的組件間按配置與邏輯引入。首先是Ext.applation是最頂級的管理者,全部的組件(或者叫應用,英文原稱Application),而後每一個mvc從本身的application開始。好比點擊某個dom要建立一個應用,能夠點擊以後執行下面代碼:jsonp
var app = $(this).attr('data-app'); Ext.create(app);
很顯然我用的是jquery來做爲輔助實現,這裏的app是「admin.app.collection.log」,而後Ext會加載js文件,文件內容以下:ui
Ext.define('admin.app.collection.log', { extend: 'Ext.app.Application', name: 'admin', controllers: ['collection.LogController'], mvcConfig: { userId:1 } });
這就建立了一個application,而後再由application加載配置的controller,文件式加載就完成了。上面第一個代碼塊中的Ext.application與上面js文件中的Ext.define基本相同。
那麼有什麼不一樣呢,說幾點個人理解,未必正確僅供參考:
一、Ext是先解析再執行,那麼js文件加載進來的要解析,會添加進整體控制中,在chrome中可對controller中的代碼斷點調試。
二、用Ext.application加載的模塊是脫離控制的,文件沒有進入no domain隊列,因此沒有調試入口。
還有幾個問題沒有解決:
一、在view中怎麼更具data(也能夠說是store)動態控制呈現的元素與行爲邏輯。
二、怎樣動態指定view的id,實現多tab展現。