我在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" />
然后我尝试在动作中连接我的事件:
import events.LoginEvent;
cLogin.addEventListener(LoginEvent.LOGIN,_handler);
private function _handler(event:LoginEvent):void {
mx.controls.Alert.show("logging in...");
}
一切对我来说都很好,但是当我编译时,我得到一个“未定义属性的错误cLogin ...显然我有我的控制与id”cLogin“但我似乎无法获得”处理它“ ......我做错了什么?
感谢。
答案 0 :(得分:1)
啊!我想通了......这对我来说是一个很大的疏忽......那只是其中的一天......
我无法获取组件上的句柄,因为它尚未创建...我通过简单地等待组件的creationComplete事件触发然后添加事件侦听器来修复此问题。
答案 1 :(得分:0)
你也可以这样做我相信:
<custom:login_form id='cLogin' login='_handler' />
答案 2 :(得分:0)
你也可以这样做我 相信:
<custom:login_form id='cLogin' login='_handler' />
轻微澄清,因为原始代码中似乎存在一些混淆。
确实,其原因是元数据标签已用于声明以这种方式提供的事件。
<mx:Metadata>
[Event(name="login", type="events.LoginEvent")]
</mx:Metadata>
但是,当使用事件监听器代替组件“event”属性(login='_handler'
)时,无需添加事件元数据:
cLogin.addEventListener(LoginEvent.LOGIN,_handler);