• ExtJs MVC应用架构示例


    项目目录结构 (源码)
    ExtJs MVC应用架构示例_www.fengfly.com
    2.
    app.js

    Ext.Loader.setConfig({  
        enabled : true,  
        paths : {  
            'Ext' : 'extjs',  
            'App' : 'app',  
            'Ext.ux' : 'extjs/ux' 
        }  
    });  
     
    Ext.QuickTips.init();  
    Ext.form.Field.prototype.msgTarget = 'side';  
     
    Ext.require('Ext.container.Viewport');  
     
    Ext.application({  
        name : 'App',  
        appFolder : 'app',  
        controllers : ['poll'],  
        launch : function() {  
            Ext.create('Ext.container.Viewport', {  
                layout : 'fit',  
                items : [{  
                            xtype : 'poll' 
                        }]  
            });  
        }  
    });

    3.
    控制器 poll.js

    Ext.define('App.controller.poll', {  
        extend : 'Ext.app.Controller',  
        views : ['poll', 'pollQuery', 'pollList', 'pollEdit', 'pollAdd'],  
        stores : ['poll'],  
        models : ['poll'],  
        init : function() {  
            this.control({  
                'pollQuery' : {  
                    'beforerender' : function() {  
                        var view = Ext.ComponentQuery.query('pollQuery')[0];  
                        view.loadView();  
                    }  
                },  
                  
                'pollQuery form button[action=submit]' : {  
                    'click' : function() {  
                        var formCmp = Ext.ComponentQuery.query('pollQuery form')[0];  
                        var basicForm = formCmp.getForm();  
                        if (basicForm.isValid()) {  
                             Ext.Msg.alert("信息", "模糊查询所有文本字段.");  
                        }  
                    }  
                },  
                  
                'pollQuery form button[action=reset]' : {  
                    'click' : function() {  
                        var formCmp = Ext.ComponentQuery.query('pollQuery form')[0];  
                        var basicForm = formCmp.getForm();  
                        basicForm.reset();  
                    }  
                },  
                  
                'pollQuery form button[action=submit2]' : {  
                    'click' : function() {  
                        var formCmp = Ext.ComponentQuery.query('pollQuery form')[1];  
                        var basicForm = formCmp.getForm();  
                        if (basicForm.isValid()) {  
                            Ext.Msg.alert("信息", "模糊查询所有文本字段.");  
                        }  
                    }  
                },  
                  
                'pollQuery form button[action=reset2]' : {  
                    'click' : function() {  
                        var formCmp = Ext.ComponentQuery.query('pollQuery form')[1];  
                        var basicForm = formCmp.getForm();  
                        basicForm.reset();  
                    }  
                },  
     
                'pollList' : {  
                    'beforerender' : function() {  
                        var view = Ext.ComponentQuery.query('pollList')[0];  
                        view.loadView();  
                    }  
                },  
     
                'pollList > grid' : {  
                    'itemdblclick' : function(table, record, html, row, event, opt) {  
                        var view = Ext.widget('pollEdit');  
                        view.loadView();  
                        view.show();  
                        view.down('form').loadRecord(record);  
                    }  
                },  
                  
                'pollList > grid button[action=add]' : {  
                    'click' : function() {  
                        var view = Ext.widget('pollAdd');  
                        view.loadView();  
                        view.show();  
                    }  
                },  
                  
                'pollList > grid button[action=remove]' : {  
                    'click' : function() {  
                        var grid = Ext.ComponentQuery.query('pollList > grid')[0];  
                        var sm = grid.getSelectionModel();  
                        grid.store.remove(sm.getSelection());  
                          
                        // 提交后台  
                    }  
                },  
     
                'pollEdit button[action=save]' : {  
                    'click' : function(button, event, opt) {  
                        var win = button.up('window'), form = win.down('form'), record = form.getRecord(), values = form.getValues();  
                        record.set(values);  
                        win.close();  
                        this.getPollStore().sync();  
                          
                        // 提交后台  
                    }  
                },  
                  
                'pollEdit button[action=close]' : {  
                    'click' : function(button, event, opt) {  
                        var win = button.up('window');  
                        win.close();  
                    }  
                },  
                  
                'pollAdd button[action=save]' : {  
                    'click' : function(button, event, opt) {  
                        var win = button.up('window'), form = win.down('form'), values = form.getValues();  
                        win.close();  
                        var grid = Ext.ComponentQuery.query('pollList > grid')[0];  
                        var store = grid.store;  
                        var record = Ext.create('App.model.poll', values);  
                        store.add([record]);  
                          
                        // 提交后台.  
                    }  
                },  
                  
                'pollAdd button[action=close]' : {  
                    'click' : function(button, event, opt) {  
                        var win = button.up('window');  
                        win.close();  
                    }  
                }  
     
            })  
        }  
    });

    4.
    模型 poll.js

    Ext.define('App.model.poll', {  
        extend : 'Ext.data.Model',  
        fields : ['name', 'senority', 'department']  
    });

    5.
    Store poll.js

    Ext.define('App.store.poll', {  
        extend : 'Ext.data.Store',  
        autoLoad : true,  
        model : 'App.model.poll',  
        data : {  
            'employees' : [{  
                        "name" : "Michael Scott",  
                        "senority" : 7,  
                        "department" : "Manangement" 
                    }, {  
                        "name" : "Dwight Schrute",  
                        "senority" : 2,  
                        "department" : "Sales" 
                    }, {  
                        "name" : "Jim Halpert",  
                        "senority" : 3,  
                        "department" : "Sales" 
                    }, {  
                        "name" : "Kevin Malone",  
                        "senority" : 4,  
                        "department" : "Accounting" 
                    }, {  
                        "name" : "Angela Martin",  
                        "senority" : 5,  
                        "department" : "Accounting" 
                    }]  
        },  
        proxy : {  
            type : 'memory',  
            reader : {  
                type : 'json',  
                root : 'employees' 
            }  
        }  
    });

    6.视图 pollQuery.js

    Ext.define('App.view.pollQuery', {  
    extend : 'Ext.container.Container',  
    alias : 'widget.pollQuery',  
    initComponent : function() {  
        var me = this;  
        Ext.applyIf(me, {  
            items : [{  
                xtype : 'fieldset',  
                margin : '10 10 0 10',  
                padding : '10 10 0 10',  
                collapsible : true,  
                title : '信息查询',  
                items : [{  
                            xtype : 'tabpanel',  
                            border : false,  
                            plain : true,  
                            activeTab : 0,  
                            items : [{  
                                xtype : 'form',  
                                border : false,  
                                padding : '10 10 10 10',  
                                title : '全部',  
                                layout : 'hbox',  
                                closable: false 
                            }, {  
                                xtype : 'form',  
                                border : false,  
                                padding : '10 10 10 10',  
                                title : '高级',  
                                layout : 'hbox',  
                                closable: false 
                            }],  
                            listeners : {  
                                'tabchange' : function(tabPanel, newCard, oldCard, pts) {  
                                    var grid = Ext.ComponentQuery.query('gridpanel')[0];  
                                    grid.setTitle(newCard.title);  
                                }  
                            }  
                        }]  
                    }]  
                });  
        me.callParent(arguments);  
    },  
    
    flushView : function() {  
        this.doLayout();  
    },  
    
    loadView : function() {  
        var tabpanelCmp = this.getComponent(0).getComponent(0);  
        var formCmp = tabpanelCmp.getComponent(0);  
        var formCmp2 = tabpanelCmp.getComponent(1);  
        formCmp.add([{  
                    xtype : 'textfield',  
                    name : 'keyword',  
                    fieldLabel : '' 
                }, {  
                    xtype : 'button',  
                    text : '搜索',  
                    style : 'margin-left: 20px',  
                    action : 'submit' 
                }, {  
                    xtype : 'button',  
                    text : '清空',  
                    style : 'margin-left: 10px',  
                    action : 'reset' 
                }]);  
                  
        formCmp2.add([{  
                    xtype : 'textfield',  
                    name : 'keyword',  
                    fieldLabel : '' 
                }, {  
                    xtype : 'button',  
                    text : '搜索',  
                    style : 'margin-left: 20px',  
                    action : 'submit2' 
                }, {  
                    xtype : 'button',  
                    text : '清空',  
                    style : 'margin-left: 10px',  
                    action : 'reset2' 
                }]);  
        this.flushView();  
    }  
    });

    视图 pollList.js

    Ext.define('App.view.pollList', {  
            extend : 'Ext.container.Container',  
            alias : 'widget.pollList',  
            requires : ['Ext.ux.RowExpander', 'Ext.grid.plugin.RowEditing'],  
            initComponent : function() {  
                var me = this;  
                Ext.applyIf(me, {  
                            margin : '0 10 10 10' 
                        });  
                me.callParent(arguments);  
            },  
         
            flushView : function() {  
                this.doComponentLayout();  
            },  
         
            loadView : function() {  
                var store = Ext.create('App.store.poll');  
         
                var pagingtoolbar = Ext.create('Ext.toolbar.Paging', {  
                            store : store,  
                            displayInfo : true,  
                            items : ['-', {  
                                        text : '每页显示' 
                                    }, {  
                                        xtype : 'combo',  
                                        name : 'pageSize',  
                                        displayField : 'pageSize',  
                                        typeAhead : true,  
                                        mode : 'local',  
                                        forceSelection : true,  
                                        triggerAction : 'all',  
                                        editable : false,  
                                        value : 15,  
                                        width : 80,  
                                        selectOnFocus : true,  
                                        itemId : '#pageSize',  
                                        store : Ext.create('Ext.data.ArrayStore', {  
                                                    fields : ['pageSize'],  
                                                    data : [[15], [20], [30], [40],  
                                                            [50]]  
                                                })  
                                    }, {  
                                        text : '条' 
                                    }, '-']  
                        });  
         
                var grid = Ext.create('Ext.grid.Panel', {  
                    title : '全部',  
                    store : store,  
                    autoShow : true,  
                    selType : 'rowmodel',  
                    selModel : Ext.create('Ext.selection.CheckboxModel', {  
                                listeners : {  
                                    selectionchange : function(sm, selections) {  
                                        grid.down('#removeButton')  
                                                .setDisabled(selections.length == 0);  
                                    }  
                                }  
                            }),  
                    columns : [Ext.create('Ext.grid.RowNumberer'), {  
                                header : 'Name',  
                                dataIndex : 'name',  
                                flex : 3  
                            }, {  
                                header : 'Senority',  
                                dataIndex : 'senority',  
                                flex : 1  
                            }, {  
                                header : 'Department',  
                                dataIndex : 'department',  
                                flex : 1  
                            }, {  
                                xtype : 'actioncolumn',  
                                draggable : false,  
                                header : '操作',  
                                flex : 1  
                            }],  
                    plugins : [{  
                        ptype : 'rowexpander',  
                        rowBodyTpl : ['<b>Department:</b> {department}  
        <br>',  
                                '<b>Summary:</b> {name}  
        ']  
                    }],  
                    dockedItems : [{  
                                xtype : 'toolbar',  
                                items : [{  
                                            text : '添加',  
                                            itemId : 'addButton',  
                                            iconCls : 'add',  
                                            action : 'add' 
                                        }, '-', {  
                                            itemId : 'removeButton',  
                                            text : '删除',  
                                            iconCls : 'remove',  
                                            disabled : true,  
                                            action : 'remove' 
                                        }, '-']  
                            }]  
                });  
         
                this.add([pagingtoolbar, grid]);  
                this.doComponentLayout();  
            }  
        });

    视图 pollEdit.js

    Ext.define('App.view.pollEdit', {  
        extend : 'Ext.window.Window',  
        alias : 'widget.pollEdit',  
        initComponent : function() {  
            var me = this;  
            Ext.applyIf(me, {  
                        layout : 'fit',  
                        title : '信息修改',  
                        bodyStyle : 'background:#fff; padding:10px;',  
                        items : [{  
                                    xtype : 'form',  
                                    border : false 
                                }],  
                        buttons : ['->', {  
                                    text : '修改',  
                                    action : 'save',  
                                    scope : this 
                                }, '-', {  
                                    text : '关闭',  
                                    action : 'close',  
                                    scope : this 
                                }]  
                    });  
            me.callParent(arguments);  
        },  
    
        flushView : function() {  
            this.doLayout();  
        },  
    
        loadView : function() {  
            var formCmp = this.getComponent(0);  
            formCmp.add([{  
                        xtype : 'textfield',  
                        fieldLabel : '部门名称',  
                        labelAlign : 'right',  
                        name : 'department' 
                    }, {  
                        xtype : 'textfield',  
                        fieldLabel : '名称',  
                        labelAlign : 'right',  
                        name : 'name' 
                    }, {  
                        xtype : 'textfield',  
                        fieldLabel : '调查名称',  
                        labelAlign : 'right',  
                        name : 'senority' 
                    }]);  
    
            formCmp.doLayout();  
            this.flushView();  
        }  
    });

    视图 pollAdd.js

    Ext.define('App.view.pollAdd', {  
        extend : 'Ext.window.Window',  
        alias : 'widget.pollAdd',  
        initComponent : function() {  
            var me = this;  
            Ext.applyIf(me, {  
                        layout : 'fit',  
                        title : '信息添加',  
                        bodyStyle : 'background:#fff; padding:10px;',  
                        items : [{  
                                    xtype : 'form',  
                                    border : false 
                                }],  
                        buttons : ['->', {  
                                    text : '添加',  
                                    action : 'save',  
                                    scope : this 
                                }, '-', {  
                                    text : '关闭',  
                                    action : 'close',  
                                    scope : this 
                                }]  
                    });  
            me.callParent(arguments);  
        },  
    
        flushView : function() {  
            this.doLayout();  
        },  
    
        loadView : function() {  
            var formCmp = this.getComponent(0);  
            formCmp.add([{  
                        xtype : 'textfield',  
                        fieldLabel : '部门名称',  
                        labelAlign : 'right',  
                        name : 'department' 
                    }, {  
                        xtype : 'textfield',  
                        fieldLabel : '名称',  
                        labelAlign : 'right',  
                        name : 'name' 
                    }, {  
                        xtype : 'textfield',  
                        fieldLabel : '调查名称',  
                        labelAlign : 'right',  
                        name : 'senority' 
                    }]);  
    
            formCmp.doLayout();  
            this.flushView();  
        }  
    });

    视图 poll.js

    Ext.define('App.view.poll', {  
            extend : 'Ext.container.Container',  
            alias : 'widget.poll',  
            autoShow : true,  
         
            initComponent : function() {  
                var me = this;  
                Ext.applyIf(me, {  
                    items : [{  
                        xtype : 'pollQuery' 
                    }, {  
                        xtype : 'pollList' 
                    }]   
                });  
                this.callParent(arguments);  
            }  
        });

    . 效果
    image

    8. 动态加载模块 app.js

    Ext.require(['Ext.app.Application']);  
         
        Ext.app.Application.implement({  
              
        loadModule : function(controllers) {  
                var me = this;  
                var controllers = Ext.Array.from(controllers), ln = controllers.length, i, controller;  
                for (i = 0; i < ln; i++) {  
                    var name = controllers[i];  
                      
                    /** 避免重复加载 */ 
                    if (!this.controllers.containsKey(name)) {  
                        controller = Ext.create(  
                                this.getModuleClassName(name, 'controller'), {  
                                    application : this,  
                                    id : name  
                                });  
                        this.controllers.add(controller);  
                        controller.init(this);  
                        controller.onLaunch(this);  
         
                    }  
                }  
            }  
        });  
         
        var application;  
        Ext.application({  
                    name : 'App',  
                    appFolder : 'app',  
                    launch : function() {  
                        application = this;  
                        this.loadModule(['main']);  
                    }  
                });  
         
        Ext.getApplication = function() {  
            return application;  
        }  
         
        Ext.getController = function(name) {  
            return Ext.getApplication().getController(name);  
        }

    main.js

    Ext.define('App.controller.main', {  
            extend : 'Ext.app.Controller',  
            refs : [{  
                        ref : 'tab',  
                        selector : 'center' 
                    }],  
            views : ['north', 'west', 'center', 'main'],  
            init : function() {  
                this.control({  
                            'north button[action=add]' : {  
                                click : function() {  
                                    var center = this.getTab();  
                                    center.add({  
                                                xtype : 'panel',  
                                                title : 'Tab',  
                                                closable : true 
                                            });  
                                }  
                            }  
                        })  
            }  
        });

    main.js

    Ext.define('App.view.main', {  
        extend : 'Ext.container.Viewport',  
        alias : 'widget.main',  
        initComponent : function() {  
            var me = this;  
            me.callParent(arguments);  
        }  
    });  
     
    Ext.create('App.view.main', {  
        layout : 'border',  
        autoShow : true,  
        renderTo : Ext.getDoc(),  
        title : 'ext4demo',  
        items : [{  
            xtype : 'north' 
        }, {  
            region : 'center',  
            layout : 'border',  
            border : false,  
            split : true,  
            margins : '0 5 5 5',  
            minSize : 100,  
            maxSize : 500,  
            items : [{  
                        xtype : 'west' 
                    }, {  
                        xtype : 'center' 
                    }]  
        }]  
              
    });

    center.js

    Ext.define('App.view.center', {  
        extend : 'Ext.tab.Panel',  
        alias : 'widget.center',  
     
        initComponent : function() {  
            var me = this;  
            Ext.apply(me, {  
                        region : 'center',  
                        layout : 'fit',  
                        autoDestroy : true,  
                        resizeTabs : true,  
                        activeTab : 0,  
                        items : [{  
                            xtype : 'panel',  
                            title : '欢迎' 
                        }]  
                    })  
            me.callParent(arguments);  
        }  
     
    });

    north.js

    Ext.define('App.view.north', {  
        extend : 'Ext.panel.Panel',  
        alias : 'widget.north',  
     
        initComponent : function() {  
            var me = this;  
            Ext.apply(me, {  
                height : 0,  
                region : 'north',  
                items : [{  
                    xtype : 'button',  
                    text : '加载模块',  
                    action : 'add' 
                }]  
            })  
            me.callParent(arguments);  
        }  
    });

    west.js

    Ext.define('App.view.west', {  
        extend : 'Ext.panel.Panel',  
        alias : 'widget.west',  
     
        initComponent : function() {  
            var me = this;  
            Ext.apply(me, {  
                title : '导航',  
                region : 'west',  
                layout : 'accordion',  
                width : 200,  
                collapsible : true,  
                split : true 
            })  
            me.callParent(arguments);  
        }  
    });
  • 相关阅读:
    2016.10.15先占坑
    2016.10.11先占坑
    2016.10.13先占坑
    2016.10.7先占坑
    main()里面为什么要放String[] args
    对于一个给定的正整数 n ,请你找出一共有多少种方式使 n 表示为若干个连续正整数的和,要求至少包括两个正整数。
    求两个数的最大公约数的三种算法总结
    C++
    Dev-c5.11的使用
    客户端和服务器端的交互(未完待续)
  • 原文地址:https://www.cnblogs.com/asks/p/4183473.html
Copyright © 2020-2023  润新知