`
fangzhouxing
  • 浏览: 213349 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ExtJS编程总结之应用面向对象设计手法

 
阅读更多

整个ExtJS框架都是以一种面向对象的方式开发的,在自己编写的程序也可以应用面向对象的设计手法。

1. 在现有类基础上创建子类

应用 Ext.extend() 能够建立强大的面向对象的JavaScript类层次结构。你可以用它构建你自己的类和派生类,当然也可以扩展Ext的内建类。 以项目中的 divo.form.AddOrEditForm 为例,它是对 Ext.form.FormPanel 的扩展,是所有新建和修改表单的基类:

/**
 * 新建或修改表单(基类)
 */
divo.form.AddOrEditForm = Ext.extend(Ext.form.FormPanel, {
    recordId : null, //public 属性
    adding : false,
    。。。
    //类的构造器
    initComponent : function() {
	。。。			
	divo.form.AddOrEditForm.superclass.initComponent.call(this);
    },
    //public 方法
    initForm : function(t) {
	。。
    },
    //扩展父类方法
    afterRender : function() {
    	divo.form.AddOrEditForm.superclass.afterRender.call(this)
	。。。
    },
    //模板方法(子类可以重写)
    validateBeforeSave : function(item) {
	return true
    }
    。。。
})    

我们通过扩展 divo.form.AddOrEditForm 创建具体的表单,例如:

/**
 * 用户新建或修改表单
 */
form.admin.UserAddOrEditForm = Ext.extend(divo.form.AddOrEditForm, {
	initComponent : function() {
		Ext.apply(this, {
			initFocusFldName : 'full_name', //让基类的 public 属性变为 private 属性
			url : "/users",
			items : [{
				fieldLabel : divo.required + "姓名",
				name : "full_name",
				allowBlank : false,
				width : 100
			。。。
		})
		form.admin.UserAddOrEditForm.superclass.initComponent.call(this);
	},
	//重写模板方法
	validateBeforeSave : function(item) {
		var t = /^[a-zA-Z0-9_\-]+$/;
		if (!t.test(item.name)) {
			this.say("用户名中含有非法字符!")
			return false
		}
		return true
	},
	。。。
})

Ext.reg("form.admin.UserAddOrEditForm", form.admin.UserAddOrEditForm)
// EOP

可以这样使用这个表单:

/**
 * 用户新建或修改窗口
*/
window.admin.UserAddOrEditWindow = Ext.extend(Ext.Window, {
	adding : null,
	recordId : null,
	closeAction : "hide",
	cancelAction : "hide",
	initComponent : function() {
		Ext.apply(this, {
			title : (this.adding?'新建':'修改')+'用户',
			height : 300,
			width : 400,
			modal : true,
			layout : "fit",
			items : {
				id : this.myId('form'),
				xtype : "form.admin.UserAddOrEditForm",
				adding : this.adding,  //public 属性赋值
				recordId : this.recordId
			},
		})

		window.admin.UserAddOrEditWindow.superclass.initComponent.call(this)
	},
	。。。
})
//EOP

通过以上步骤,我们构造出了这样的类层次结构:

Ext.form.FormPanel
   +-- divo.form.AddOrEditForm
          +-- form.admin.UserAddOrEditForm

2. 标记 public 方法

器件类的 public 方法会被其他器件使用,因此不能随意更改其名字和接口,要求按下面的代码例子那样标记 public 方法:

//public
addItem : function() {
          。。。
},

3. 应用模板方法设计模式

GOF给出的模板方法(Template Method)模式的定义是这样的:

模板方法是一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在内容上存在变数的环节。可以看出来,
模板方法模式也是为了巧妙解决变化对系统带来的影响而设计的。使用模板方法使系统扩展性增强,最小化了变化对系统的影响。

请看上面的代码例子,validateBeforeSave 就是一个模板方法,它在基类中这样被使用:

// public
save : function(callbackOnSuccess) {
	var item = this.getForm().getObjectValues()
	if (!this.validateBeforeSave(item)) {
		return
	}
	Ext.MessageBox.wait("正在保存...", '请稍候');
              。。。

它的巧妙之处在于,如果子类不重写该方法,它的默认实现就是什么也不验证(直接返回真值)。如果子类需要添加验证业务逻辑,则可以 重写它,如上面的 UserAddOrEditForm 代码例子所展示的那样。

子类中重写模板方法时,要求像这样做上标记:

//重写
validateBeforeSave : function(item) {
           。。。
},

4. 往 Ext.Component 中加入新方法

《用ExtJS开发客户端 3 跨器件的消息发布和订阅》中,你可以看到下面这样的代码:

grid.xf.CorpUserGrid = Ext.extend(divo.grid.SmartSimpleGrid, {
	initComponent : function() {
		...
		this.subscribe("window.xf.AdvisorChanged",this.onCorpInfoChanged,this)
		this.on('beforedestroy',function() {
		      this.unsubscribe()
		},this)
		grid.xf.CorpUserGrid.superclass.initComponent.apply(this,arguments)
	},
	onCorpInfoChanged : function(subj, msg, data) {
		this.onRefreshList()
	},
...

查阅 ExtJS的API文档,你肯定会发现它是没有subscribe、unsubscribe这两个方法的,这是通过下面这样的代码往 Ext.Component 中加入的新方法 (参见client/js/core/ExtOverride.js):

Ext.override(Ext.Component, {
。。。
	subscribe : function(name, callback, scope) {
		if (!this.pagebusSubs)
		    this.pagebusSubs = []
		this.pagebusSubs.push(divo.subscribe(name, callback, scope))
	},
	unsubscribe : function() {
		if (!this.pagebusSubs) return
		
		for (var i = 0; i < this.pagebusSubs.length; i++)
			divo.unsubscribe(this.pagebusSubs[i])
	},
	publish : function(name, message) {
		divo.publish(name, message)
	},
。。。

因为大多数Ext界面器件继承自Ext.Component,所以可以在器件类中直接用 this 引用这些方法。

5. 参考文献

 

分享到:
评论

相关推荐

    ExtJs培训sample_for面向对象设计

    "ExtJS培训sample_for面向对象设计"这个主题主要聚焦于如何在ExtJS中应用面向对象的设计原则和模式。 在面向对象设计中,有四个核心概念:封装、继承、多态和抽象。这些概念同样适用于JavaScript,因为JavaScript是...

    ExtJS对几种面向对象体现.txt

    综上所述,ExtJS作为一款强大的前端框架,在面向对象编程方面有着广泛的应用和支持。无论是组件封装、模块化还是事件驱动等方面,都体现了面向对象的核心理念。同时,ExtJS还可以很好地与其他后端技术如C#相结合,...

    EXTjs图开编程EXTJS

    通过深入学习并实践EXTJS的图形编程,开发者能够构建出具有专业级图形展示能力的Web应用,为用户提供直观、交互性强的数据分析工具。在实际项目中,结合EXTJS的图形组件,我们可以实现复杂的业务逻辑,提高工作效率...

    extjs 高级编程

    extjs高级编程extjs高级编程extjs高级编程

    EXTJS应用EXTJS应用EXTJS应用EXTJS应用

    EXTJS的应用开发不仅涉及到前端JavaScript代码,还涵盖了后端的ASP.NET技术、数据库管理和用户体验设计等多个方面。深入理解EXTJS的组件模型、事件处理机制,以及如何与服务器端进行有效交互,对于构建高效且用户...

    ExtJS 界面设计器

    ExtJS是一款强大的JavaScript库,主要用于构建富客户端的Web应用程序。其界面设计器,正如标题所示,是一种可视化的开发工具,能够极大地提升开发效率和用户体验。这个工具允许开发者通过拖放组件和直观地调整属性来...

    extjs流程界面设计器参考_ExtJS工作流设计器_extjs工作流_extjs_

    ExtJS是一种广泛使用的JavaScript库,专门用于构建富客户端的Web应用程序。它提供了丰富的组件和工具,使得开发者可以创建出功能强大、用户界面友好的Web应用。在“extjs流程界面设计器参考”中,我们主要关注的是...

    extjs多版本整合应用

    多版本整合ExtJs应用多版本整合ExtJs应用多版本整合ExtJs应用多版本整合ExtJs应用多版本整合ExtJs应用多版本整合ExtJs应用多版本整合ExtJs应用多版本整合ExtJs应用多版本整合ExtJs应用多版本整合ExtJs应用。

    ExtJs学习资料14-OOP[JavaScript面向对象编程].doc

    ExtJs学习资料14-OOP[JavaScript面向对象编程]

    ExtJS的可视化界面设计器

    总结来说,ExtJS的可视化界面设计器是一个强大的开发辅助工具,它将复杂的前端界面设计过程简化,使得开发者能够更加专注于应用逻辑的实现,提高了开发效率和项目的可维护性。对于希望快速构建高质量ExtJS应用的团队...

    ExtJS介绍及应用举例

    ExtJS的核心是MVC(Model-View-Controller)设计模式,这使得开发大型、复杂的应用程序变得更加有序和可维护。 标题“ExtJS介绍及应用举例”表明了内容主要涉及对ExtJS框架的基本介绍和实际应用场景的展示。这可能...

    ext面向对象编程教程

    面向对象编程(Object-Oriented Programming, OOP)是EXTJS的核心特性之一,允许开发者创建可重用、可维护的代码结构。 EXTJS 面向对象编程主要体现在以下几个方面: 1. **组件化编程**:EXTJS 使用组件化的思想来...

    extjs 做的桌面应用程序界面

    extjs 做的桌面应用程序界面,只是前台的界面, 没有后台代码

    ExtJS+Web应用程序开发指南

    主要包括data、widget、form、grid、dd、menu,其中最强大的应该算grid了,编程思想是基于面向对象编程(oop),扩展性相当的好。可以自己写扩展,自己定义命名空间。 主要包括三个大的文件:ext-all.css,ext-base.js,...

    ExtJS 可视化设计器

    总结起来,"ExtJS 可视化设计器"是一个强大的工具,结合了直观的图形界面和强大的代码生成功能,极大地简化了ExtJS应用的开发流程。配合汉化文件和详细的安装说明,即使是初学者也能快速入门,提高开发效率。对于...

    extjs视图设计器

    EXTJS视图设计器是一款强大的前端开发工具,专为构建企业级Web应用的用户界面而设计。EXTJS是一种基于JavaScript的富客户端框架,由Sencha公司开发,它提供了一套完整的组件化、可拖拽的界面元素,使得开发者可以...

    Extjs4.1.1

    课程简介: ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架,本...第十九讲.ExtJS之组件面向对象编程(一) 第二十讲.ExtJS之组件面向对象编程(二) 项目实战Extjs版在线选课系统:

    EXTJS Grid总结例子

    EXTJS Grid是一款强大的数据展示组件,广泛应用于Web应用开发中,尤其在数据密集型界面设计时,EXTJS Grid以其高效的数据加载、灵活的分页、排序、过滤和自定义功能而受到开发者青睐。本总结例子将深入探讨EXTJS ...

Global site tag (gtag.js) - Google Analytics