Apache flex Flex组件和main.mxml通信
我正在空中构建Flex4应用程序 我制作了main.mxml和login.mxml组件。这一切都可以工作,但我无法在我的两个MXML(主MXML和组件MXML)之间通信 登录可以工作,但是它必须向main发送一个事件,我可以更改main中的状态 这是我的裁剪代码 login.mxmlApache flex Flex组件和main.mxml通信,apache-flex,flex4,components,Apache Flex,Flex4,Components,我正在空中构建Flex4应用程序 我制作了main.mxml和login.mxml组件。这一切都可以工作,但我无法在我的两个MXML(主MXML和组件MXML)之间通信 登录可以工作,但是它必须向main发送一个事件,我可以更改main中的状态 这是我的裁剪代码 login.mxml //resulthandler if login is succesfull loginUserResult.addEventListener(ResultEvent.RESULT,
//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.";
}
}
<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" width="239" height="223" includeIn="State1">
</components:login>
因此login.mxml成功发送事件
main.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.";
}
}
<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" width="239" height="223" includeIn="State1">
</components:login>
因此,组件loginInstanceCom中的实例在windowedapplication initialize中无法识别,我使用了相同的id
它给出了以下错误:
TypeError:错误#1009:无法访问空对象引用的属性或方法
希望有人能帮助我。
塔克斯 虽然您没有指定,但我假设login.mxml组件是main.mxml组件的子组件 要分派事件,请执行以下操作:
dispatchEvent(new Event('myLoginSuccesful'));
您可能希望向组件添加元数据,以便在代码提示中显示该事件,但这不是必需的
在主应用程序中侦听事件:
loginInstance.addEventListener('myLoginSuccesful',onLoginSuccesful);
我可能会在主组件的初始化处理程序中添加此代码
在处理程序方法中,只需更改状态:
protected function onLoginSuccesful(event:Event):void{
currentState = 'main';
}
您可以使用Swiz框架在要分派数据的方法之前使用元数据标记分派事件。
然后,您可以使用currentstate语句来修复要查看的状态。您不能只使用视图堆栈而不是状态吗?在我看来,州在flex中是如此丑陋。-我的1。Swiz框架元数据不发送事件;它只为这些事件添加侦听器。这仍然取决于您是否发送所述事件;为了让Swiz调用处理程序方法,您必须使用Swiz事件调度器分派该事件。侦听器用于以正确的方式执行事件。您可以理解我的意思,因为我已经多次使用“swiz.dispatchEvent()”。我刚刚试着解决上述问题。你好,谢谢你的快速回答。我对Flex和Actionscript还不太熟悉,但我明白你的答案。现在唯一的问题是MyLogin实例是什么?myLoginInstance=组件的id?(给出错误)myLoginInstance=公共变量myLoginInstance:login,其中login是自定义组件的名称?因为这也会产生一个错误。如果你有时间,请回答。好意,GizzymyLoginInstance将是MyLogin.mxml组件的实例的名称。在MXML中创建实例时,它将是id标记。在ActionScript中创建实例时,该实例将是变量名。my实例是在MXML中创建的,就像main应用程序中的
code
。它仍然说我不能引用空对象。。。我不明白我做错了什么。请帮帮我,因为它越来越让人沮丧了。出于好意,GizzyI修改了答案中的代码,以指定您的显式实例名称。基本上是“loginInstance.addEventListener('MyLoginSuccessful',OnLoginSuccessful);”,如果这没有帮助;你应该编辑你的问题,发布一个更扩展的代码段。我想我被误解了,我的组件只是在我的mxml代码中“声明”的,像这样->并且它不识别id?我真的不明白。。。