Flex 组件和 main.mxml 通信

Posted

技术标签:

【中文标题】Flex 组件和 main.mxml 通信【英文标题】:Flex Components and main.mxml communication 【发布时间】:2012-03-25 02:03:54 【问题描述】:

我正在 AIR 中构建一个 Flex 4 应用程序。

我制作了一个 main.mxml 和一个 login.mxml 组件。一切正常,但我无法在我的两个 mxml(MAIN 和 COMPONENT)之间进行通信

登录有效,但它必须向主服务器发送一个事件,我可以更改主服务器中的状态。

这是我的裁剪代码。

login.mxml

//resulthandler if login is succesfull
                loginUserResult.addEventListener(ResultEvent.RESULT, loginUserResultHandler);

        public function loginUserResultHandler(event:ResultEvent):void
        
            if(loginUserResult.lastResult == 1)
            
                dispatchEvent(new Event('myLoginSuccesfull'));
                trace("dispatchEvent - myLoginSuccesfull ");
            
            else
            
                this.loginErrorLBL.text = "Username and/or password aren't valid.";
            
         

所以 login.mxml 成功发送事件。

ma​​in.mxml

    <fx:Script>
    <![CDATA[
        import mx.events.FlexEvent;

        protected function windowedapplication1_initializeHandler(event:FlexEvent):void
        
            loginInstanceCom.addEventListener('myLoginSuccesfull', onLoginSuccesful);
        

        protected function onLoginSuccesful(event:Event):void
            trace("onLoginSuccesful recived");
            currentState = "main";
        
    ]]>
</fx:Script>
</fx:Script>
<s:states>
    <s:State name="State1"/>
    <s:State name="main"/>
</s:states>

<components:login id="loginInstanceCom" x="263" y="10"   includeIn="State1">
</components:login>

因此,来自组件 loginInstanceCom 的实例在我使用相同 ID 的窗口应用程序初始化中无法识别。

它给出了以下错误:

TypeError:错误 #1009:无法访问空对象引用的属性或方法。

希望有人可以帮助我。 谢谢!

【问题讨论】:

你不能只使用视图堆栈而不是状态吗?在我看来,国家的弹性太丑了。 【参考方案1】:

虽然您没有指定,但我假设 login.mxml 组件是 main.mxml 组件的子组件。

要调度事件,请执行以下操作:

dispatchEvent(new Event('myLoginSuccesful'));

您可能希望向组件添加元数据以使该事件显示在代码提示中,但这不是必需的。

在主应用程序中监听事件:

loginInstance.addEventListener('myLoginSuccesful',onLoginSuccesful);

我可能会将这段代码添加到主组件的初始化处理程序中。

在您的处理程序方法中,只需更改状态:

protected function onLoginSuccesful(event:Event):void
 currentState = 'main';

【讨论】:

您好,感谢您的快速答复。我对 Flex 和 Actionscript 很陌生,但我知道你是答案。现在唯一的问题是myLoginInstance 是什么? myLoginInstance = 组件的 ID? (给出错误) myLoginInstance = a public var myLoginInstance:login 其中 login 是自定义组件的名称?因为这也给出了一个错误。如果你有时间请回答。亲切的问候,Gizzy myLoginInstance 将是您的 MyLogin.mxml 组件的 hte 实例的名称。当在 MXML 中创建实例时,这将是 id 标记。在 ActionScript 中创建实例时,该实例将成为变量名。 我的实例是在 MXML 中创建的,就像 MainApplication 中的 code。它仍然说我不能引用一个空对象......我不明白我做错了什么。请帮忙,因为它越来越令人沮丧。亲切的问候,Gizzy 我修改了答案中的代码以指定您的明确实例名称。基本上是“loginInstance.addEventListener('myLoginSuccesful',onLoginSuccesful);”如果这没有帮助;您应该编辑您的问题以发布更广泛的代码段。 我想我被误解了,我的组件只是像这样在我的 mxml 代码中“声明”-> 并且它不识别 id ?我真的不明白...【参考方案2】:

您可以使用 Swiz 框架在要分派数据的方法之前使用元数据标记来分派事件。 然后你可以使用 currentstate 语句来修复你想要查看的状态。

【讨论】:

-1 来自我。 Swiz 框架元数据不分派事件;它只为这些事件添加侦听器。调度所述事件仍由您决定;为了让 Swiz 调用处理程序方法,您必须使用 Swiz Event Dispatcher 调度该事件。 监听器用于以正确的方式执行事件。您可以理解我的意思,因为我多次使用“swiz.dispatchEvent()”。我刚刚试图解决上述问题。

以上是关于Flex 组件和 main.mxml 通信的主要内容,如果未能解决你的问题,请参考以下文章

使用 RemoteObject 和多个组件时的 Flex 4 最佳实践

FlashDevelop 看不到我制作的 MXML 组件文件

Flex 组件通信

mx:Window 组件是不是有自己的 applicationComplete?

使用 javascript 的 flex air 移动通信

允许在角度组件之间共享 relative 和 flex