如何获得Flex中自定义组件的句柄?
时间:2020-03-06 14:43:40 来源:igfitidea点击:
我在Flex中有一个自定义登录组件,它是一种简单的表单,当用户单击登录按钮时,该组件将调度自定义LoginEvent:
<?xml version="1.0" encoding="utf-8"?>
<mx:Form xmlns:mx="http://www.adobe.com/2006/mxml" defaultButton="{btnLogin}">
<mx:Metadata>
[Event(name="login",tpye="events.LoginEvent")]
</mx:Metadata>
<mx:Script>
import events.LoginEvent;
private function _loginEventTrigger():void {
var t:LoginEvent = new LoginEvent(
LoginEvent.LOGIN,
txtUsername.text,
txtPassword.text);
dispatchEvent(t);
}
</mx:Script>
<mx:FormItem label="username:">
<mx:TextInput id="txtUsername" color="black" />
</mx:FormItem>
<mx:FormItem label="password:">
<mx:TextInput id="txtPassword" displayAsPassword="true" />
</mx:FormItem>
<mx:FormItem>
<mx:Button id="btnLogin"
label="login"
cornerRadius="0"
click="_loginEventTrigger()" />
</mx:FormItem>
</mx:Form>
然后,我有一个包含flex应用程序的main.mxml文件,将组件毫无问题地添加到该应用程序中:
<custom:login_form id="cLogin" />
然后,我尝试在actionscript中整理我的事件:
import events.LoginEvent;
cLogin.addEventListener(LoginEvent.LOGIN,_handler);
private function _handler(event:LoginEvent):void {
mx.controls.Alert.show("logging in...");
}
一切对我来说看起来都很不错,但是当我编译时,我收到"未定义属性cLogin的错误...很明显,我可以使用id" cLogin"进行控制,但似乎无法获得"处理"。我究竟做错了什么?
谢谢。
解决方案
啊!我想通了...这对我来说是一个很大的疏忽...那只是其中的一天...
我无法获得组件上的句柄,因为它尚未创建...我通过等待组件的creationComplete事件触发然后添加事件侦听器来解决此问题。
我相信我们也可以这样做:
<custom:login_form id='cLogin' login='_handler' />
You can also do something like this I believe: <custom:login_form id='cLogin' login='_handler' />
稍作澄清,因为原始代码似乎有些混乱。
确实,其原因在于,已使用元数据标签来声明将以这种方式提供的事件。
<mx:Metadata>
[Event(name="login", type="events.LoginEvent")]
</mx:Metadata>
但是,当使用事件侦听器代替组件的"事件"属性(" login ='_ handler'")时,无需添加事件元数据:
cLogin.addEventListener(LoginEvent.LOGIN,_handler);
- addEventListener->不需要元数据标签
- 组件标签中的事件属性->需要元数据标签

