使用组件 |
|
|
|
| 处理组件事件 > 委托事件 | |||
您可以将 Delegate 类导入到脚本或类中,以便将事件委托给特定的范围和函数(请参阅"组件语言参考"中的Delegate 类)。要导入 Delegate 类,请使用以下语法:
import mx.utils.Delegate;compInstance.addEventListener("eventName", Delegate.create(scopeObject,function));
scopeObject 参数指定一个范围,指定的 function 参数在该范围中被调用。
调用 Delegate.create() 有两个常见用途:
请参阅将事件委托给函数。
将函数作为参数传递给 addEventListener() 时,会在广播器组件实例的范围内调用该函数,而不是在声明该函数的对象内调用。请参阅委托函数的范围。
如果有两个广播同名事件的组件,则调用 Delegate.create() 十分有用。例如,如果您有一个复选框和一个按钮,为了确定哪个组件正在广播 click 事件,则您将必须对从 eventObject.target 属性中获取的信息使用 switch 语句。
要使用下面的代码,请将名为 myCheckBox_chb 的复选框和名为 myButton_btn 的按钮放置到舞台上。选择这两个实例,再按 F8 键创建一个新元件。如果对话框处于基本模式,请单击"高级",然后选择"为 ActionScript 导出"。在"AS 2.0 类"文本框中输入 Cart。在属性检查器中,按您的意愿设置新元件的名称。现在该元件与 Cart 类相关联,元件的实例变成该类的实例。
import mx.controls.Button;
import mx.controls.CheckBox;
class Cart {
var myCheckBox_chb:CheckBox;
var myButton_btn:Button;
function onLoad() {
myCheckBox_chb.addEventListener("click", this);
myButton_btn.addEventListener("click", this);
}
function click(eventObj:Object) {
switch(eventObj.target) {
case myButton_btn:
// 将广播器实例名称和
// 事件类型发送到"输出"面板
trace(eventObj.target + ": " + eventObj.type);
break;
case myCheckBox_chb:
trace(eventObj.target + ": " + eventObj.type);
break;
}
}
}
以下代码是为使用 Delegate 而经过修改的同一类文件 (Cart.as) 中的代码:
import mx.utils.Delegate;
import mx.controls.Button;
import mx.controls.CheckBox;
class Cart {
var myCheckBox_chb:CheckBox;
var myButton_btn:Button;
function onLoad() {
myCheckBox_chb.addEventListener("click", Delegate.create(this, chb_onClick));
myButton_btn.addEventListener("click", Delegate.create(this, btn_onClick));
}
// 两个单独的函数处理事件
function chb_onClick(eventObj:Object) {
// 将广播器实例名称和
// 事件类型发送到"输出"面板
trace(eventObj.target + ": " + eventObj.type);
// 将 FLA 文件中与 Cart 类
// 相关联的元件的绝对路径
// 发送到"输出"面板
trace(this)
}
function btn_onClick(eventObj:Object) {
trace(eventObj.target + ": " + eventObj.type);
}
}
addEventListener() 方法有两个参数:一个事件的名称和一个对侦听器的引用。侦听器可以是一个对象或一个函数。如果传递一个对象,则会在该对象的范围内调用分配给该对象的回调函数。但是,如果传递一个函数,则会在调用 addEventListener() 的组件实例的范围内调用该函数。(有关详细信息,请参阅关于侦听器中的范围。)
因为是在广播器实例的范围内调用函数,所以函数体内的关键字 this 指向的是广播器实例,而不是包含该函数的类。因此,您无法访问包含该函数的类的属性和方法。请使用 Delegate 类将函数的范围委托到包含类,以便可以访问包含类的属性和方法。
下面的示例对 Cart.as 类文件的变体使用与上一部分相同的方法(请参阅将事件委托给函数):
import mx.controls.Button;
import mx.controls.CheckBox;
class Cart {
var myCheckBox_chb:CheckBox;
var myButton_btn:Button;
// 定义一个变量以从
// chb_onClick 函数访问
var i:Number = 10
function onLoad() {
myCheckBox_chb.addEventListener("click", chb_onClick);
}
function chb_onClick(eventObj:Object) {
// 您期望可以访问
//变量 i 并输出 10。
// 但是,这将未定义的值发送
// 到"输出"面板,因为
// 该函数的范围并不是
// 定义 i 的 Cart 实例。
trace(i);
}
}
要访问 Cart 类的属性和方法,请调用 Delegate.create() 作为 addEventListener() 的第二个参数,如下所示:
import mx.utils.Delegate;
import mx.controls.Button;
import mx.controls.CheckBox;
class Cart {
var myCheckBox_chb:CheckBox;
var myButton_btn:Button;
// 定义一个变量以从
// chb_onClick 函数访问
var i:Number = 10
function onLoad() {
myCheckBox_chb.addEventListener("click", Delegate.create(this, chb_onClick));
}
function chb_onClick(eventObj:Object) {
// 将 10 发送到"输出"面板
// 因为函数的范围是
// Cart 实例
trace(i);
}
}
|
|
|
|