extjs-mvc开发模式

1、Extjs应用程序分割成Model-View-Controller三层,为JS应用程序的如何组织代码指明了方向,同时使得大规模JS代码变得更加易于重用和维护。
2、这个事例的配置资料请参考之前的配置,另外关于数据访问我采用的是jsonp跨域访问,数据格式json,整个文件的结构如下图:
extjs-mvc结构图
效果图:
这里写图片描述
test.html:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>test</title>
        <link rel="stylesheet" type="text/css" href="../ext-4.2/resources/css/ext-all.css" />
        <style type="text/css">
            .table_add{
                background-image: url(../ext-4.2/icons/table/table_add.png)
            }
            .table_delete{
                background-image: url(../ext-4.2/icons/table/table_delete.png)
            }
            .table_edit{
                background-image: url(../ext-4.2/icons/table/table_edit.png)
            }
            .table_comm{
                background-image: url(../ext-4.2/icons/table/table.png)
            }
        </style>
        <script type="text/javascript" src="../ext-4.2/bootstrap.js"></script>
        <script type="text/javascript" src="app.js"></script>
    </head>
    <body>
    </body>
</html>

app.js:

Ext.onReady(function(){
    Ext.Loader.setConfig({
        enabled:true
    });
    Ext.application({
        name:'AM',//应用的名字
        appFolder:'app',//应用的目录
        launch:function(){
            // Ext.create('Ext.container.Viewport',{
                // layout:'auto',
                // items:{
                    // xtype :'userlist',
                    // title:'User',
                    // html:'here' 
                // }
            // })
            Ext.create('Ext.window.Window',{
                items:{
                    xtype :'userlist',
                    title:'User',
                    html:'here' 
                }
            }).show();
        },
        controllers:[
            'Controller'
        ]
    });
})

mvc模式中view.js:

Ext.define('AM.view.View', {
    extend: 'Ext.grid.Panel',
    alias: ['widget.userlist'],//别名
    frame: true,
    //forceFit: true,
    width: 900,
    height: 280,
    features: [{
        ftype: 'summary'
    }],
    viewConfig:{
        plugins:[
            Ext.create('Ext.grid.plugin.DragDrop',{
                ddGroup:'ddTree',
                dragGroup:'userlist',
                dropGroup:'userlist',
                enableDrag:true,
                enableDrop:true
            })

        ],
        listeners:{
            drop:function(node,data,dropRec,dropPosition){
                var st = this.getStore();
                for(var i=0;len=st.getCount(),i<len;i++){
                    st.getAt(i).set('index',i+1);
                }
            }
        }
    },
    columns: [
        //行号两种方法
        //Ext.create(Ext.grid.RowNumberer,{/*locked:true*/})
        {
            xtype : 'rownumberer'
        },{
            text: 'name',
            dataIndex: 'name',
            width:100,
           // locked:true
        }, {
            text: 'age',
            dataIndex: 'age',
            width:80,
            summaryType:'average',
            summaryRenderer:function(value,summaryData,dataIndex){
                return Ext.String.format('平均年龄:'+value);
            }
        },{
            text:'sex',
            dataIndex:'sex',
            width:50,
            renderer:function(o){
                if(o){
                    if(o=='女'){
                        return '<font color="red">'+o+'</font>'
                    }else{
                        return '<font color="green">'+o+'</font>'
                    }
                }
            }
        }, {
            text: 'email',
            dataIndex: 'email',
            field: {
                xtype: 'textfield',
                allowBlank: false
            },
            width:130
        },{
            text: 'index',
            dataIndex: 'index',
            width:50
        },{
            text:'isIT',
            dataIndex:'isIT',
            xtype:'booleancolumn',
            width:50,
            trueText:'是',
            falseText:'不是'
        },{
            text:'birthday',
            dataIndex:'birthday',
            xtype:'datecolumn',
            width:180,
            format:'Y-m-d h:i:s'
        },{
            text:'deposit',
            dataIndex:'deposit',
            xtype:'numbercolumn',
            width:150
            //format:'0.00'
        },{
            text:'描述',
            xtype:'templatecolumn',
            tpl:'姓名是{name}年龄是{age}',
            width:150
        },{
            text:'Action',
            xtype:'actioncolumn',
            id:'delete',
            icon:'../ext-4.2/icons/used/delete.png',
            width:50
        }],
    renderTo: Ext.getBody(),
    store: 'Store',
    tbar: [{
            xtype: 'button',
            text: '添加',
            iconCls: 'table_add'
        }, {
            xtype: 'button',
            text: '删除',
            iconCls: 'table_delete',
            id: 'deletebutton'
        }, {
            xtype: 'button',
            text: '修改',
            iconCls: 'table_edit'
        }, {
            xtype: 'button',
            text: '查看',
            id:'selection',
            iconCls: 'table_comm'
        },{
            xtype:'button',
            id:'save',
            text:'保存',
            icon:'../ext-4.2/icons/table/table_save.png'
        }],
    dockedItems: [{
            xtype: 'pagingtoolbar',
            store: 'Store',
            dock: 'bottom',
            displayInfo: true
        }],
    plugins: [
        /*Ext.create(Ext.grid.plugin.CellEditing, {
            clicksToEdit: 1
        })*/
        Ext.create('Ext.grid.plugin.RowEditing',{
            clicksToEdit: 1
        })
    ],
    //selType: 'checkboxmodel', // 设置选择模式
    //multiSelect: true, // 运行多选
    //selType:'rowmodel',//行选择
    selType:'cellmodel',
    enableKeyNav:true,
    initComponent: function() {
        this.callParent(arguments);
    }
})

mvc中controller.js:

Ext.define('AM.controller.Controller',{
    extend:'Ext.app.Controller',
    init:function(){
        this.control({
            userlist:{
                edit:function(editor,e,opt){
                    //e.record.commit();
                    alert(e.record.data.email)
                }
            },
            'userlist button[id=save]':{
                click:function(o){
                    var grid = o.ownerCt.ownerCt;
                    var st = grid.getStore();
                    //st.sync();
                    var records = st.getUpdatedRecords();
                    Ext.Array.each(records,function(model){
                        model.commit();
                    })
                }   
            },
            /*'userlist':{
                itemclick:function(view,record,item,index,e,opt){
                    alert(2342)
                    //alert(Ext.encode(record.data))
                    var sm = view.getSelectionModel();
                    //alert(sm.getCurrentPosition().row+'  '+sm.getCurrentPosition().column);
                }
            },*/
            'userlist button[id=selection]':{
                click:function(o){
                    var grid = o.ownerCt.ownerCt;
                    var sm = grid.getSelectionModel();
                    //sm.deselect();//取消选择
                    //alert(sm.getLastSelected().get('name'));
                    //alert(sm.isSelected(0));
                    //sm.selectRange(1,2,true);
                    //sm.selectByPosition({'row':1,'column':2})
                    var models = grid.getSelectionModel().getSelection();
                    if(models.length == 0){
                        Ext.Msg.alert('提示','你至少选择一条数据');
                    }else{
                        var data = Ext.encode(models[0].getData());
                        alert(data)
                    }
                }
            },
            'userlist button[id=deletebutton]':{
                click:function(o){
                    var grid = o.ownerCt.ownerCt;
                    var models = grid.getSelectionModel().getSelection();
                    if(models.length == 0){
                        Ext.Msg.alert('提示','你至少选择一条数据');
                    }else{
                        var st = grid.getStore();
                        Ext.each(models,function(record){
                            st.remove(record)
                        })
                    }
                }
            },
            'userlist actioncolumn[id=delete]':{
                click:function(o,item,rowIndex,colIndex,e){
                    alert(rowIndex+'   '+colIndex)
                }
            }
        })
    },
    views:['View'],
    stores:['Store'],
    models:['Model']
})

mvc中的model.js、store.js:

Ext.define('AM.model.Model',{
    extend:'Ext.data.Model',
    fields:[
            {name:'name',type:'string'},
            {name:'age',type:'int'},
            {name:'email',type:'string'},
            {name:'birthday',type:'string'},
            {name:'deposit',type:'int'},
            {name:'isIT',type:'string'},
            {name:'sex',type:'string'},
            {name:'index',type:'int'}
    ]
})
Ext.define('AM.store.Store',{
    extend:'Ext.data.Store',
    //storeId:'s_user',
    model:'AM.model.Model',
    autoLoad:true,
    proxy:{
        type:'jsonp',
        url:'app/json/app.json',
        reader:{
            type:'json',
            root:'topics',
            totalProperty:'total'
        }
    }
})

app.json:

Ext.data.JsonP.callback1({
    'total' : 6,
    'topics' : [{
            'age' : 1,
            'email' : 'qwer',
            'name' : 'tom',
            'birthday' : new Date(),
            'deposit' : 100000000.8,
            'isIT' : true,
            sex : '男',
            'index' : 1
        }, {
            sex : '女',
            'age' : 2,
            'email' : 'qwer',
            'name' : 'jerry',
            'index' : 2
        }, {
            'age' : 3,
            'email' : 'qwer',
            'name' : 'lily',
            'index' : 5
        }, {
            'age' : 4,
            'email' : 'qwer',
            'name' : 'lucy',
            'index' : 4
        }, {
            'age' : 5,
            'email' : 'qwer',
            'name' : 'jay',
            'index' : 6
        }, {
            'age' : 6,
            'email' : 'qwer',
            'name' : 'july',
            'index' : 3
        }
    ]
});

猜你喜欢

转载自blog.csdn.net/zyt807/article/details/51451810