如何获得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->不需要元数据标签
- 组件标签中的事件属性->需要元数据标签