`

[ExtJS] MVC应用架构示例

阅读更多
1
项目目录结构



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);
	}
});


7. 效果




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);
	}
});





我的 mc 框架源码在附件里.

安装要求:
jdk 1.5+
maven
tomcat
extjs 4.0.7+ 需要复制到对应目录.
index.html 可以快速了解本框架.

pom.xml 中有些包的 groupId 可能是自己定的需要注意.
由于是公司的图片资源,因此不可能上传的.





  • 大小: 68.8 KB
  • 大小: 64.2 KB
  • mc.7z (47.4 KB)
  • 下载次数: 610
  • 大小: 86.9 KB
13
8
分享到:
评论
11 楼 努力吧飞翔 2013-04-23  
10 楼 litterdeer 2012-10-23  
好东西....
9 楼 basherone 2012-09-06  
可以用,谢谢了
8 楼 amos_tl 2012-07-24  
Gamain 写道
楼主能否给一个示例源码啊,我照着做的怎么不能运行呢?


详细的错误描述?
7 楼 Gamain 2012-07-23  
楼主能否给一个示例源码啊,我照着做的怎么不能运行呢?
6 楼 amos_tl 2012-05-17  
ayanami001 写道
为什么要弄套前台的mvc呢 一直没明白

1 构建更加复杂的应用
2 便于封装组件,这个例子稍微改改就是一个增删改查的页面组件
3 代码看着更舒服
5 楼 ayanami001 2012-05-16  
为什么要弄套前台的mvc呢 一直没明白
4 楼 zouzou 2012-05-16  
能上源码更好
3 楼 JonathanWang 2012-05-16  
不错,mark以后学习。没有弄过ext,不过这个不需要后台程序么?
2 楼 zhengeili 2012-05-16  
顶一个
1 楼 pinnerc 2012-05-16  
不错,学习了。

相关推荐

    extJs4.2MVC示例

    严格按照MVC架构分的曾,可以运行的extJs4.2MVC示例,在myclipse加到一个项目里的的webroot文件夹下,运行index.html即可

    ExtJs 4.1 mvc 简单示例

    ExtJS 4.1 是一个强大的JavaScript框架,用于构建富客户端Web应用程序。它采用MVC(Model-View-...通过学习和实践这个示例,开发者能够更好地理解ExtJS 4.1的MVC架构,并掌握如何构建自己的富客户端应用程序。

    ExtJS MVC 官方实例

    ExtJS MVC 官方实例是基于ExtJS框架的模型-视图-控制器(MVC)架构的应用示例。ExtJS是一款强大的JavaScript库,用于构建富客户端的Web应用程序,而MVC模式则是它组织代码和管理应用程序状态的核心设计模式。在这个...

    Extjs 4.2.0 MVC 架构 官方文档例子中文

    控制器是Extjs MVC架构中的关键组成部分之一,主要用于处理用户的交互行为。通过定义控制器,我们可以更清晰地分离业务逻辑与视图层。 ##### 3.1 创建控制器 在`app/controllers`目录下创建控制器文件。例如,在`...

    自己写的ExtJS4.0用MVC的示例

    总结来说,这个“自己写的ExtJS4.0用MVC的示例”展示了如何利用MVC模式在客户端构建复杂的应用程序,提供了良好的代码组织和可维护性。通过研究这个示例,你可以学习到如何有效地使用模型、视图和控制器,以及它们...

    extjs4.0 MVC 示例代码

    MVC(Model-View-Controller)模式是EXTJS中实现复杂应用架构的关键设计模式,它将应用程序的不同部分分离出来,使得代码更易于维护和扩展。下面将详细探讨EXTJS 4.0中的MVC概念以及在示例代码中可能涉及的关键知识...

    extjs mvc 完整demo

    EXTJS MVC 完整 demo 是一个基于 EXTJS 框架实现的模型-视图-控制器(Model-View-Controller)架构的示例项目。EXTJS 是一款强大的前端开发框架,用于构建桌面级的富互联网应用程序(RIA)。它提供了一套完整的组件...

    ExtJS MVC入门级开发案例

    这个"ExtJS MVC入门级开发案例"是一个理想的学习资源,适合初学者理解并掌握如何在ExtJS中应用MVC架构。 **1. MVC模式详解** Model(模型):负责处理应用程序的数据逻辑,与后端服务器进行交互,获取和存储数据。...

    Extjs4 MVC 官方实例整合 未改动 未删减 部署即可运行

    在ExtJS 4中,MVC(Model-View-Controller)设计模式是其核心架构,用于组织和管理应用程序的逻辑。这个官方实例集是ExtJS 4 MVC模式的一个完整展示,旨在帮助开发者理解并掌握如何使用MVC进行开发。 **MVC模式详解...

    ExtJS 4 MVC

    ExtJS 4 MVC是一个强大的前端开发框架,它利用模型-视图-控制器(Model-View-...MVCWithExtJS4这个压缩包文件可能包含了实现这些概念的示例代码,通过学习和研究这些代码,你将能够更好地掌握Ext JS 4的MVC架构。

    ExtJS4.2 MVC

    通过学习这个小例子,你可以了解到ExtJS4.2 MVC的架构是如何工作的,如何组织代码,以及如何利用MVC模式开发复杂的Web应用。这对你提升JavaScript编程技巧,尤其是前端开发技能,特别是对于需要处理大量数据和交互的...

    extjs4Mvc事例

    在ExtJS 4中,MVC架构被进一步强化,以适应大型复杂应用的需求。下面我们将深入探讨ExtJS 4 MVC的主要组件和它们的工作原理: 1. **Model(模型)**:模型层负责处理应用程序的数据。在ExtJS中,模型类定义了数据...

    Extjs配置文件和示例文件

    在ExtJS中,JavaScript不仅用于编写应用逻辑,还通过其强大的类系统和MVC(Model-View-Controller)架构来组织和管理代码。 综上所述,这个压缩包包含的资源是学习和使用ExtJS的重要组成部分。通过理解和使用这些...

    spring mvc+hibernate+extjs代码示例

    这是一个基于Spring MVC、Hibernate和ExtJS的Web应用示例,主要展示了如何整合这三个技术来构建一个功能完善的后台管理系统。下面将分别对这三个技术及其整合方式进行详细介绍。 **Spring MVC** Spring MVC是Spring...

    《Extjs Web应用程序开发指南》代码(全)

    例如,使用Extjs的MVC架构可以使代码逻辑更加清晰,组件的复用性更强;而通过与服务器的数据交互,可以实现实时更新和异步操作,提升用户体验。 总的来说,这个压缩包提供了一个全面的学习路径,让开发者从基础知识...

    ASP.NET MVC5 +ExtJS6 表格示例

    通过这个示例,开发者可以深入理解前后端分离的开发模式,掌握ASP.NET MVC5和ExtJS6的协同工作,从而提升Web应用的开发效率和用户体验。TEST001可能是这个示例项目的主要文件,包含了所有相关的源代码和配置文件,...

    extjs-mvc-architecture.pdf

    ### ExtJS MVC 架构深度解析 ...总之,ExtJS 4的MVC架构为开发高效、可维护的大型客户端应用提供了坚实的基础。通过理解MVC的核心概念、优势和实践,开发者可以充分利用ExtJS的特性,构建出既美观又实用的应用程序。

    Extjs4 + Asp.net MVC Demo

    ExtJS4 + ASP.NET MVC Demo是一个结合了前端ExtJS4框架和后端ASP.NET MVC架构的应用示例,展示了如何在Web开发中实现数据操作的增删改查功能,并且利用了ExtJS4的MVC模式来提高代码的组织性和可维护性。这个Demo还...

    extjs6.6项目示例

    在这个"extjs6.6项目示例"中,我们可以深入理解ExtJS的用法,并学习如何构建基于此框架的应用程序。 首先,"原生态extjs框架的web项目"指的是使用纯ExtJS库构建的项目,没有依赖其他额外的前端框架或库。这种项目...

Global site tag (gtag.js) - Google Analytics