Flex自定义事件调度和使用viewstack监听

时间:2011-05-27 16:09:52

标签: flex event-handling

我在flex中有一个关于事件调度和调度的问题。

我的目标是传递在一个组件(Comp1)中捕获的电子邮件地址,并传递给另一个组件(Comp2)。这两个组件是视图堆栈的导航器内容。自定义事件从Comp1正确分派了电子邮件,但不知何故无法访问Comp2。应用程序(Main)看起来像:

                  

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

        protected function loginHandler(event:LoginEventComplete):void
        {
            myViewStack.selectedChild = idViewMain;
        }
    ]]>
</fx:Script>

<s:Panel width="100%" height="100%">
    <mx:ViewStack id="myViewStack" selectedIndex="0" width="100%" height="100%">
        <views:Comp1 id="idViewLogin" login="loginHandler(event)"/>
        <views:Comp2 id="idViewMain"/>
    </mx:ViewStack>
</s:Panel>

Comp1看起来像

<fx:Metadata>
    [Event(name="login", type="events.LoginEventComplete")]
</fx:Metadata>
<fx:Script>
    <![CDATA[
        import events.LoginEventComplete;

        protected function bnLogIn_clickHandler(event:MouseEvent):void{
            var e:LoginEventComplete = new LoginEventComplete("login");
            e.workemail = tiWorkEmail.text;
            dispatchEvent(e);
        }
    ]]>
</fx:Script>

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<s:layout>
    <s:VerticalLayout verticalAlign="middle" horizontalAlign="center"/>
</s:layout>

<s:Panel width="400" height="500">
    <s:Label text="Email" x="130" y="150"/>
    <s:TextInput id="tiWorkEmail" top="140" left="180" right="60"/>
    <s:Button 
        id="bnLogIn"
        label="Log In"
        top="220" left="180"
        click="bnLogIn_clickHandler(event)"/>
</s:Panel> 

Comp2看起来像

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

        import valueObjects.Employee;

        protected function init():void
        {
            this.addEventListener(LoginEventComplete.LOGIN, mainHandler);
        }

        private function mainHandler(event:LoginEventComplete):void{
            tiWorkEmail.text = event.workemail;
        }

    ]]>
</fx:Script>

<fx:Declarations>

</fx:Declarations>

<s:layout>
    <s:VerticalLayout verticalAlign="middle" horizontalAlign="center"/>
</s:layout>

<s:Label id="idWorkEmail" text="Email"/>
<s:TextInput id="tiWorkEmail"/>

自定义事件LoginEventComplete看起来像

包事件 {   import flash.events.Event;   公共类LoginEventComplete扩展了Event   {     public var workemail:String;

public static const LOGIN:String = "login";

public function LoginEventComplete(type:String)
{
  super(type, true, false);
  this.workemail = workemail; 
}

override public function clone():Event
{
  var newEvent:LoginEventComplete = new LoginEventComplete(type);
  newEvent.workemail = workemail;
  return newEvent;
}

} }

有人可以帮忙吗?非常感谢!

最佳David W

2 个答案:

答案 0 :(得分:1)

您正在意识到任何分层视图结构必须传递信息的问题之一。这个问题可以通过几种方式解决,但我觉得我应该告诉你,如果你的应用程序变得很大,你可能需要查看一个应用程序框架。一个像ParsleyRobotLegs

现在,解决方案。您将无法使用冒泡从一个兄弟组件转到另一个兄弟组件,因为冒泡 up 显示列表(子级到父级等等)。您可以在公共父级上侦听事件,然后将信息推送到其他兄弟中,但这会在父容器上添加大量逻辑。

一个简单的解决方法是创建一个模型(一个只有公共属性来存储信息的类),该模型可以绑定在父级上并绑定到两个兄弟中。然后,如果更改信息,另一个可以接收相同的信息(或使用绑定)。

例如:

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

        [Bindable] private var someData:SomeModel = new SomeModel();

        protected function loginHandler(event:LoginEventComplete):void
        {
            myViewStack.selectedChild = idViewMain;
        }
    ]]>
</fx:Script>

<s:Panel width="100%" height="100%">
    <mx:ViewStack id="myViewStack" selectedIndex="0" width="100%" height="100%">
        <views:Comp1 id="idViewLogin" login="loginHandler(event)" data="{someData}/>
        <views:Comp2 id="idViewMain" data="{someData}/>
    </mx:ViewStack>
</s:Panel>

答案 1 :(得分:1)

我可以告诉你,调度事件只会向上移动层次结构链。听起来,基于您的第一个代码段,您正试图让它横向移动。

<mx:ViewStack id="myViewStack" selectedIndex="0" width="100%" height="100%">
    <views:Comp1 id="idViewLogin" login="loginHandler(event)"/>
    <views:Comp2 id="idViewMain"/>
</mx:ViewStack>

因此,一种解决方案是在事件的主要组件中有一个侦听器,然后在comp2中执行公共方法。这可能是最简单的路线。

另一种解决方案可能是将值存储在全局对象中;这两个组件都有引用。

相关问题