ExtJs 帶參數的MVC


題記:研究使用ext兩個星期了,從痛苦中逐漸走向明朗。

展示列表的子列表的數據時需要將當前的數據傳給下一個mvc。

比如用戶列表,點擊一個用戶查看該用戶的日志列表。

首先是controller,放一個方法,注意showLog方法的兩個參數,還有mvcConfig參數是我的自定義參數,供下一個mvc去調用。用Ext.applation動態添加controller。

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中綁定點擊事件,這個比較基礎

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處理了。

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對數據的控制。

由於Ext的mvc是按文件系統(fileSystem)化分邏輯的,所以上面的代碼段是分別放在不同的js文件中的,路徑和類名的對應關系注意一下。

再說一下Ext的機制,模塊按需加載,模塊的組件間按配置與邏輯引入。首先是Ext.applation是最頂級的管理者,所有的組件(或者叫應用,英文原稱Application),然后每個mvc從自己的application開始。比如點擊某個dom要創建一個應用,可以點擊之后執行下面代碼:

var app = $(this).attr('data-app');
Ext.create(app);

很顯然我用的是jquery來作為輔助實現,這里的app是“admin.app.collection.log”,然后Ext會加載js文件,文件內容如下:

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基本相同。

那么有什么不同呢,說幾點我的理解,未必正確僅供參考:

1、Ext是先解析再執行,那么js文件加載進來的要解析,會添加進總體控制中,在chrome中可對controller中的代碼斷點調試。

2、用Ext.application加載的模塊是脫離控制的,文件沒有進入no domain隊列,所以沒有調試入口。

 

還有幾個問題沒有解決:

1、在view中怎么更具data(也可以說是store)動態控制呈現的元素與行為邏輯。

2、怎樣動態指定view的id,實現多tab展示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM