`
xiaozhi7616
  • 浏览: 196626 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ext学习笔记03 - 事件

    博客分类:
  • Ext
阅读更多

 

Ext中的事件机制

Ext中的事件机制是在 Ext.util.Observable 中定义的,举一个例子来说明事件机制,先看一下代码,然后慢慢说

 

person.js

Ext.namespace("com.meizhi");

/* 定义NameSpace的别名 */
Mz = com.meizhi;

Mz.Person = function() {
	/* 定义事件 */
	this.addEvents(
		"nameChange",
		"sexChange"
	);
};

Ext.extend(Mz.Person, Ext.util.Observable, {
	name:"",
	sex:"",
	setName:function(_name){
		if(this.name != _name) {
			/* 发布事件 */
			this.fireEvent("nameChange", this, this.name, _name);
			this.name = _name;
		}	
	},
	setSex:function(_sex){
		if(this.sex != _sex){
			/* 发布事件 */
			this.fireEvent("sexChange", this, this.sex, _sex);
			this.sex = _sex;
		}
	}
});

 

看JS文件中的定义

  1. 先定义了一个Person类,在类中只有一个属性addEvents,属性值是一个字符串数组,在这里是定义了两个 Event 事件的名字。
  2. 声明 Person 类继承自 Ext.util.Observable 类,并且定义了Person类的另外一些属性:name,sex,以及它们的写方法(这里把setName和setSex称为属性更合适一些)。
  3. 在属性的写方法 setName ,setSex 中,如果传入的值和实例化的 Person 对象的属性值不一致就会调用相应的事件,并且给属性赋值。
  4. 这样 Person 类的属性定义就完成了,并且现在 Person 是具有Ext事件机制的类,以后在 Person 类的实例中绑定和调用事件就非常方便了。

Ext.util.Observable 维护了一个events 对象的数组,并提供了更加方便的对于事件的封装和调用机制。(参考:http://www.cnblogs.com/meetrice/archive/2008/05/23/1206108.html

 

addEvents():绑定事件,看一下它的源代码

addEvents : function(o){
    if(!this.events){   
        this.events = {};
    }

    if(typeof o == 'string'){
        for(var i = 0, a = arguments, v; v = a[i]; i++){
            if(!this.events[a[i]]){

			// 将传入的事件名称注册到事件列表中                
			this.events[a[i]] = true;
            }
        }
    }else{
        Ext.applyIf(this.events, o);
    }
}

 

该方法实际上就是在 Person 对象上绑定了两个没有任何实现的事件名 ,这样 Person 对象就具有了两个空的Event对象(绑定可以执行操作的Event对象使用 addlistener 方法)。

 

fireEvent():发布事件,也就是触发绑定的事件。源代码中的定义

fireEvent : function(){
        if(this.eventsSuspended !== true){
	  //通过addEvents()注册的事件会被封装成events对象
            var ce = this.events[arguments[0].toLowerCase()];
            if(typeof ce == "object"){
	        //触发事件对象
                return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1));
            }
        }
        return true;
    }

 

 

现在Person类的结构就很清楚了,

  1. name属性
  2. sex属性
  3. setName属性(如果传入参数和name属性不一致,调用 “nameChange” 事件)
  4. setSex属性(如果传入参数和name属性不一致,调用 “sexChange” 事件)

在person.js中完成是事件的定义和发布,那事件是在什么时候被订阅的呢? 事件触发之后又要进行哪些操作呢?  

 

person.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Event</title>
<link type="text/css" rel="stylesheet" href="../../ext/resources/css/ext-all.css">
<script type="text/javascript" src="../../ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../../ext/ext-all.js"></script>

<script type="text/javascript" src="person.js"></script>
<script type="text/javascript">
	var _person = null;
	
	button_click = function() {
		_person.setName(prompt("请输入姓名", ""));
		_person.setSex(prompt("请输入性别", ""));
	}
	
	Ext.onReady(function(){
		var txt_name = Ext.get("txt_name");
		var txt_sex = Ext.get("txt_sex");
		
		/* 构建Person类 */
		_person = new Mz.Person();
		
		/* 订阅事件 */
		_person.on("nameChange", 
						function(_person, _old, _new){
							txt_name.dom.value = _new;
						});
		/* 订阅事件 */						
		_person.on("sexChange",
						function(_person, _old, _new){
							txt_sex.dom.value = _new;
						});
		/* 订阅事件 */
		_person.on("nameChange", 
						function(_person, _old, _new){
							document.title = _new;
						});
	});
</script>
</head>
<body>
姓名:<input type="text" id="txt_name" maxlength="10" /><br/>
性别:<input type="text" id="txt_sex" maxlength="10" /><br/>
<input type="button" value="输入" onclick="button_click()"/>
</body>
</html>

 

HTML文件页面中定义了两个输入框,和一个按钮,通过Ext.onReady(),页面初始化后首先执行里面的代码

  1. Ext.get()取得文本框中的值
  2. 构造 Person 类实例
  3. 订阅事件,这个时候定义 Person 中的设值属性的操作具体执行的内容,给setName()和setSex()订阅的事件中添加内容,这一点非常灵活,我们一开始只要先定义一个事件,而这个事件只有一个名字,没有具体实现,我们在订阅这个事件的时候才告诉它如果事件发生我们需要进行什么样的操作。

在点击按钮的时候,调用 button_click 方法来给 person 实例属性赋值。

 

 

 

在订阅事件的时候,用到的是 Observable.on 方法,实际上它是 Observable.addListener 的缩写(Ext里面的缩写好多啊...),源代码中是这样定义的

Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener;

 

 

绑定事件真正起作用的方法就是addListener()方法,源码中的定义

addListener : function(fn, scope, options){
    scope = scope || this.obj;
    if(!this.isListening(fn, scope)){
        var l = this.createListener(fn, scope, options);
        if(!this.firing){
            this.listeners.push(l);
        }else{ // if we are currently firing this event, don't disturb the listener loop
            this.listeners = this.listeners.slice(0);
            this.listeners.push(l);
        }
    }
}

 

 

最后看一下效果:

  • 页面中有两个input框和一个button

  • 点击“输入”button,然后弹出来一个对话框,要求输入姓名

  • 点击确定,输入框的内容会自动赋值到 id 为 txt_name 的 input 框中,HTML文档的标题也会变成刚才输入的姓名的值,同时会弹出第二个对话框要求输入性别

  • 输入性别确认,值被带到 id 为 txt_sex 的 input 框中

 

顺便说一下例子中涉及到的其他的方法:

  • Ext.onReady():用法相当于 window.onload ,是在页面装载完成时调用的方法,Ext.onReady是一个简写,定义在Ext.core.EventManager中,源代码:
onDocumentReady : function(fn, scope, options){
	if(!docReadyEvent){
        		initDocReady();
	}
	if(docReadyState || Ext.isReady){ // if it already fired
		options || (options = {});
		fn.defer(options.delay||0, scope);
	}else{
		docReadyEvent.addListener(fn, scope, options);
	}
}

 

在这个例子中,我们订阅了两次 nameChange 事件,这也是Ext中很重要的一个机制 -- 事件列表 ,在整个应用当中,公布一个事件,这个事件可以被多次订阅,这一点是很常用的,实现了一个完善的应用体系。

 

通过上面的例子也可以看出Ext的一些缺点:完成这样一个 事件定义、发布、过程所用到的代码比较复杂,不够简洁,要是更加直观一些就更好了,可以让人更加容易理解一些。

 

 

Ext学习笔记01 - NameSpace,类实例属性,类实例方法,类静态方法

Ext学习笔记02 - 构造方法,类继承,类实例方法重写

Ext学习笔记03 - 事件

Ext学习笔记04 - UI组件 - Component, Button

Ext学习笔记05 - UI组件 - Panel,TextField

Ext学习笔记06 - Window

Ext学习笔记07 - Window及Window中的布局

Ext学习笔记08 - 日期控件

Ext学习笔记09 - ComboBox

 

 

 

 

  • 大小: 11.4 KB
  • 大小: 20.1 KB
  • 大小: 20.6 KB
  • 大小: 11.7 KB
分享到:
评论
1 楼 小卡卡西 2011-10-13  
   .....

相关推荐

    EXT学习笔记-项目应用实践

    这篇EXT学习笔记主要涵盖了EXTJS中面向对象编程的一些关键概念和实践,包括命名空间、类定义、构造函数、属性与方法的访问控制(私有和公有)、静态属性与方法以及继承机制。 1. **命名空间**:在EXTJS中,命名空间...

    Gwt-ext学习笔记之基础篇

    ### Gwt-ext学习笔记之基础篇 #### 一、安装CypalStudio工具 为了能够开始Gwt-ext的学习之旅,首先需要确保开发环境已经搭建好。CypalStudio是一款非常实用的工具,它能帮助开发者更高效地进行GWT项目的开发。 1....

    Gwt-ext学习笔记

    在阅读《Gwt-ext学习笔记.pdf》这份资料时,应重点学习上述知识点,并通过实践项目来加深理解。同时,关注Gwt-ext的更新和社区资源,以便获取最新的API信息和最佳实践。不断练习和探索,你将能够熟练运用Gwt-ext构建...

    (转载)GWT -EXT学习笔记-基础

    ### GWT-EXT基础知识详解 #### 一、GWT与GWT-EXT简介 ...GWT提供了一套丰富的UI组件库,简化了Web应用的开发...这为后续深入学习GWT-EXT提供了坚实的基础。接下来,可以根据实际需求进一步探索更多高级特性和技术细节。

    ext学习笔记代码

    ext学习笔记代码 ext学习笔记代码 ext学习笔记代码

    Ext API详解--笔记

    这篇笔记将深入探讨Ext Js的核心API,涵盖多个关键模块。 1. **Ext.Element**: `Ext.Element`是Ext Js中的基础元素操作类,它封装了对DOM元素的各种操作,如尺寸调整、样式修改、事件处理等。在`EXT核心API详解...

    Ext学习笔记-个人版.doc

    Ext是一个JavaScript库,主要用于构建富客户端应用程序,尤其是那些基于Web的桌面级应用。它提供了一套完整的组件模型、布局管理、数据绑定以及丰富的用户界面组件,使得开发者能够创建出功能强大的交互式网页应用。...

    Gwt-Ext学习笔记之进级篇

    在GWT-Ext的学习过程中,首先你需要了解如何定义和实现远程服务。这是GWT的一个核心特性,它允许客户端和服务器之间的安全通信。在GWT中,远程服务调用通常涉及以下几部分: 1. **远程服务接口(Remote Service ...

    ext学习资料 20篇详细学习笔记 初学者ext学习的文档

    这份"ext学习资料 20篇详细学习笔记 初学者ext学习的文档"是针对EXT初学者的一份宝贵资源,旨在帮助初学者快速入门EXT开发。 EXT的学习通常包括以下几个核心部分: 1. **EXT基础**:首先,你需要了解EXT的基本概念...

    Ext学习笔记

    Ext JS4学习教程+笔记(一) Ext JS4学习教程+笔记(二)事件处理 Ext JS4学习教程+笔记(六)DataView面板 Ext JS4学习教程+笔记(七)树面板Tree Panel Ext JS4学习教程+笔记(三)Ajax请求 ...Ext学习网址

    Yui_ext 学习笔记

    【Yui_ext 学习笔记】 Yui_ext 是基于 Yahoo! UI Library (YUI) 的扩展,主要用于构建富客户端的 Web 应用程序。这篇学习笔记主要介绍了 Yui_ext 的基础知识,适合对 JavaScript 和 HTML DOM 有一定了解的初学者。 ...

    Gwt-Ext学习笔记之基础篇- www.hxiaseo.cn技术网站

    标题中的"Gwt-Ext学习笔记之基础篇"指的是关于Gwt-Ext的初级教程,这是一种基于Google Web Toolkit (GWT) 的扩展库,用于构建富互联网应用程序(RIA)。Gwt-Ext提供了丰富的用户界面组件,使得开发者可以利用Java语言...

    Ext学习和学习笔记

    里面包括Ext学习.doc和Ext学习笔记.doc两份资料。来自网上。

    ext api,ext 学习笔记,SWFUpload_多文件上传及部分工具

    在EXT学习笔记中,"What_is_that_Scope_all_about2.htm"可能涉及的是JavaScript作用域和EXT中的scope概念,这对于理解和调试EXT应用中的事件处理和回调函数至关重要。"JsonTool.htm"可能介绍了EXT如何与JSON数据进行...

    十分有用有帮助的EXT学习笔记

    以下是对EXT学习笔记中涉及的关键知识点的详细说明: 1. **EXT Form**: EXT中的表单组件是构建用户交互界面的重要部分。它们允许用户输入数据并将其提交到服务器。EXT Form支持多种字段类型,如文本框、选择框、...

Global site tag (gtag.js) - Google Analytics