Ext4.2.1 Model-Store-controller交互實例

Yangcl 11年前發布 | 12K 次閱讀

    

    這篇博客總結了富客戶端應用程序設計中,Ext MVC application architecture 概念的實際應用。針對Model、Store、Controller和Action四個核心模塊進行關鍵部位該如何使用和交互的介紹。按照設計的先后順序給出對應類和腳本。每個類和腳本都有注釋,這個信息很重要</span>

Model層</b></span>
兩個Model:分別對應主表,和主表的從表</span>

主 model,對應主表
Ext.define('AM.model.material.apply.ListModel', {
    extend: 'Ext.data.Model',
    requires:['AM.model.material.apply.DetailModel'],
fields: [ {name: 'id'}, //索引 {name: 'sqyj'}, //申請依據 {name: 'sqdw'}, //申請單位 {name: 'sqdwmc'}, //申請單位名稱 { name: 'sqsj',// 申請時間 type: 'date', dateFormat:'Y-m-d H:i:s' },

    {
        name: 'sqlb', // 申請類別 0-維護保養 1-裝備修理 2-戰備補充
        type:'int'
    },
    {
        name: 'status',// 狀態(已下達/未下達/已處理)
        type:'int'
    },
    //擁有者
    {name:'owner'},
    //創建時間
    {
        name:'cjsj',
        type:'date',
        dateFormat:'Y-m-d H:i:s'
    }
],
hasMany:
{
    model:'AM.model.material.apply.DetailModel',name:'qcsqmxbs'
}

});</pre>
</span>

應明細表的Model

明細表 model 對應主表的明細表或叫從表
Ext.define('AM.model.material.apply.DetailModel',
{
    extend:'Ext.data.Model',

fields:
[
    {name: 'id'},        //索引
    {name: 'qcsqb'},    //器材申請
    {name: 'qcdm'},     //器材代碼
    {name: 'qcmc'},     //器材名稱
    {
        name: 'sqlb', //類別(器材/物資)
        type: 'int'
    },
    {name: 'qcsl'},     //器材數量
    {name: 'jldw'},     //計量單位
    {name: 'zbmc'},    //裝備名稱
    {name: 'zbdm'},     //裝備代碼
    //狀態
    {
        name:'status',
        type:'int'
    },
    //擁有者
    {name:'owner'},
    //創建時間
    {
        name:'cjsj',
        type:'date',
        dateFormat:'Y-m-d H:i:s'
    }
],
validations:
[
    //用于設置字段為必填項(0為有效值,空字符串未無效值),若字段沒有值或為無效值則不通過驗證
    {type:'presence',field:'qcmc'},
    {type:'float',field:'qcsl'}
],

idProperty:'id',
foreignKey:'qcsqb'

});</pre>
</span>
Store層
與兩個Model對應的Store

主表、從表對應的Store
Ext.define('AM.store.material.apply.ListStore',
{
    extend:'Ext.data.Store',
    model:'AM.model.material.apply.ListModel',//使用到的對應的Model
    autoLoad:false,
    pageSize:25,
    sorters:
    [
        {
            property:'sqsj',
            direction:'DESC'
        }
    ],

proxy:   
{
    type:'ajax', //代理模式!
    api:
    {
        create:'material/apply!add.action',    //與對應Action的方法的交互方式!
        read: 'material/apply!list.action',
        update:'material/apply!update.action',
        destroy:'material/apply!destroy.action'
    },
    reader:
    {
        type:'json',
        root:'items',
        totalProperty: 'results',
        successProperty: 'success',
        messageProperty: 'message'
    },
    writer: Ext.create('FH.util.JsonWriter',
    {
        //writeAllFields:false
    }),
    listeners:
    {
        exception: function(proxy, response, operation)
        {
            Ext.MessageBox.show(
            {
                title: '請求處理錯誤',
                msg: Ext.isString(operation.getError())? operation.getError() : '請確認網絡或服務是否正常',
                icon: Ext.MessageBox.ERROR,
                buttons: Ext.Msg.OK
            });
        }
    }
}

});</pre>
</span></span>
視圖層:View</b></span>
    對應的兩個View如下。這里值得一說的是在ExtJS-4的新特性和規范中,視圖與Store和Model的關系由controller來控制。所以,在你看到的所有的 view 中,基本只有界面組件和一些事件監聽的代碼,很少能看到有Store和Model的出現。這點要注意。

這個功能頁面的主視圖 
Ext.define('AM.view.material.apply.ListView',
{
    extend:'Ext.container.Container',
    id:'MaterialApplyListView',
    alias:'widget.MaterialApplyListView', //對應left菜單里viewId

require:
[
    'Ext.grid.*',
    'Ext.data.*',
    'Ext.ux.RowExpander',
    'Ext.selection.CheckboxModel'
],
layout:'border', 
closable:'true',

initComponent:function ()
{
    //其中包含大量的邏輯腳本,一般不會少于300行
    //只為了說明使用方式,這里省略代碼。
}

});</pre>
</span></span>DetailView代碼如下:

對應從表的明細界面,附屬于這個功能的主界面 
Ext.define('AM.view.material.apply.DetailView',
{
    extend:'Ext.window.Window',
    require:[
        'Ext.selection.CellModel',
        'Ext.grid.',
        'Ext.data.',
        'Ext.util.*'
    ],
    title:'XXX明細',
    resizable:false,
    closable:false,
    width:'900',
    height:'480',
    modal:'true',
    layout:'border',

initComponent:function ()
{
    //其中包含大量的邏輯腳本,一般不會少于300行
    //只為了說明使用方式,這里省略代碼。
}

});</pre>
</span></span></div> 重要的Controller 
由于這一段代碼在這里總是報出有非法字符,而后日志則被攔截,所以代碼段以圖片的形勢給出


</span>
后臺Action</b></span>



 

 本文由用戶 Yangcl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!