0

我在 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”,但我似乎无法获得“它的句柄”......我究竟做错了什么?

谢谢。

4

3 回答 3

1

啊!我想通了……这是对我的一个很大的疏忽……这只是那些日子之一……

我无法获取组件的句柄,因为它尚未创建...我通过简单地等待组件的 creationComplete 事件触发然后添加事件侦听器来解决此问题。

于 2008-09-25T15:54:22.967 回答
0

我相信你也可以做这样的事情:

<custom:login_form id='cLogin' login='_handler' />
于 2008-09-25T17:47:03.507 回答
0

我相信你也可以做这样的事情:

<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 -> 不需要元数据标签
  • 组件标签中的事件属性 -> 需要元数据标签
于 2008-10-26T12:22:54.913 回答