Search for
Login | Username Password Forgot? | Email: | Create Account
Non English | Popularity: 0 | Entries: 63 | Updated: 3h 57m ago | | Add to My Feeds

Ext中的自定义事件是个好东西,对于某些特殊需求的实现,用它是个很不错的选择。然而经常有人问我为什么他们定义的事件无法被触发,最头痛的是不报错,怎么看都找不到原因。
今天我就来简单的分析一下,先来看如下一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Ext.ns('www.ineeke.com');
www.ineeke.com.demo = Ext.extend(Ext.Panel, {
 
	constructor: function(){
 
		www.ineeke.com.demo.superclass.constructor.call(this, {
 
			id: 'demo',
			tbar: [{
				text: 'say',
				handler: function(){
					this.fireEvent('say');
				}
			}]
		});
 
		this.addEvents('say');
		this.on('say', this.saySomething, this);
	},
 
	saySomething: function(){
		Ext.Msg.alert('www.ineeke.com');
	}
});

上面的代码很简单,而且代码是100%没有错的!可是,当我按下say这个按钮时,saySomething()这个函数却没有执行。这是为什么呢?
其实,问题就在触发事件的那行代码上:

this.fireEvent('say');

而问题的关键就是这里的this,很多人没有搞清楚这里的this指的是谁,以为这里的this是和

this.addEvents('say');

中的this是同一个对象。其实前者指的是点击的按钮本身,而后者则是www.ineeke.com.demo这个组件。有关这些作用域的问题,见[JavaScript变量作用域]。
那么如何解决这个问题,实现我们的需求呢?下面给出三种我常用的方案:
第一种方案
为tbar中的按钮增加scope属性来指定this的指向。

1
2
3
4
5
6
7
8
tbar: [{
	text: 'say',
	handler: function(){
		this.fireEvent('say');
	},
	//这个this指的是www.ineeke.com.demo
	scope: this
}]

第二种方案
使用Ext.getCmp()来实现。

1
2
3
4
5
6
tbar: [{
	text: 'say',
	handler: function(){
		Ext.getCmp('demo').fireEvent('say');
	}
}]

第三种方案
使用ownerCt来实现。

1
2
3
4
5
6
tbar: [{
	text: 'say',
	handler: function(){
		this.ownerCt.ownerCt.fireEvent('say');
	}
}]

三者的优缺点:
第一种:优点是简单易用,缺点是有局限性。
第二种:优点是getCmp()可以在任意时候获得到任意一个指定ID的组件,缺点当然就是必须指定一个ID(我想,这算是一个缺点吧)及效率较低。
第三种:优点是层次关系很清晰直观,缺点是如果组件嵌套的层次过多,这个可就有的写了 n:-ts

就我写了这么久(也不是很久啦,O(∩_∩)O哈哈~)的ExtJS而言,第二种方案我从未使用过,用的最多的是第一种,第三种次之。因为如果代码组织的清晰规范的话,第一种和第三种就足够了,第二种根本就用不到,而且第二种的效率也低。

或许你会对下面这些文章感兴趣:

  • 2010年03月24日 -- pinyin4j中文转拼音
    最近需要做一个在Ext.form.ComboBox中实现中文拼音缩写查询数据库功...
  • 2010年01月18日 -- 时刻保持饥渴状态
    不知道为啥,突然间感觉过去的一年又被我荒废掉了,貌似是因为这几天看了很多技术牛人...
  • 2010年01月8日 -- 打印Ext组件中的内容
    描述一下大概功能需求:从Ext的GridPanel中选择一条记录,将这条记录的详...
  • 2009年12月24日 -- delete window[this.tipFnName]
    越来越发现Ext的源码中很多地方对数据的有效性检验的不够好,甚至很多地方都没有检...
  • 2009年12月17日 -- Ext DatePicker大小自适应
    不知道为什么Ext的DatePicker明明是有height和width配置选项...
  • 2009年12月11日 -- Ext obj.ucountry is null
    此问题出现在BasicForm调用load()方法进行数据回填且配置了Basic...
  • 2009年11月26日 -- Spring MVC 文件上传
    突然之间很痛恨那些用采集程序做的垃圾站,遇到个问题搜索一下出来几百个网页,打开一...
  • 2009年09月1日 -- Ext代码优化并减少编码量
    Ext做的项目里经常要将几个组件合起来做成一个具有某一功能的组件,而且这样的功能...
  • 2009年08月17日 -- Ext TabPanel items高度宽度自适应
    写Ext的时候经常会遇到一些莫名其妙,令人感到非常神奇的问题,甚至都没办法用语言...
  • 2009年07月14日 -- Ext DataView自身拖拽
    Ext的examples中有组件与组件之间的数据拖拽,可就是没找到组件自身中的数...



More from Neeke's Blog

九月的第一篇 10 Sep 1
我能歘 10 Jul 29
关于职业规划 10 Jul 29
蛋疼的QQ群 10 Jul 29

^ Back To Top