向嵌套组件添加功能

时间:2011-05-03 16:41:35

标签: flash actionscript-3 flex4 flash-builder flashcatalyst

O.K。这是情况......

我有一个自定义mxml组件,其中包含几个图像和4个按钮。组件文件已包含每个按钮的clickHandler。我需要能够访问clickHandler或创建另一个函数并将其附加到Main.mxml文件中的那些按钮。我应该添加到原始clickHandlers吗?如果是这样,我如何将该方法应用于我的Main.mxml文件?

FYI:该组件有5个状态,每个clickHandler触发状态之间的转换。

以下是组件文件中的两个clickHandlers

protected function submit_clickHandler():void
        {
            const state:String = currentState;
            if ( state == 'state1' ) {
                currentState='state2';
            }
            if ( state == 'state3' ) {
                currentState='state4';
                addElement(images[i]);     //The methods I want to run from 
                getStudentAnswer();        //within the Main.mxml.
                submit();                  //If I add them here, I get an
                newQuestion();             //undefined method error.
            }
            if ( state == 'state4' ) {
                currentState='state4';
            }
            if ( state == 'state5' ) {
                currentState='state4';
            }
            if ( state == 'state3' ) {
                Sequence1.play();
            }
        }

        protected function checkAnswer_clickHandler():void
        {
            const state:String = currentState;
            if ( state == 'state2' ) {
                currentState='state1';
            }
            if ( state == 'state4' ) {
                currentState='state5';
            }
        }

谢谢, JM

1 个答案:

答案 0 :(得分:1)

如果您可以访问按钮的调度事件,只需将“bubbles”设置为“true”并在Main.mxml中侦听事件。如果您将显示列表视为带分支的分层树,则会出现气泡沿分支向上移动直到到达第一个DisplayObject的事件。在此过程中,它会检查每个DisplayObject以查找是否正在等待捕获事件。

这是一个基本的插图,其中Main正在侦听click事件,并且具有带有子Sprite实例的子MovieClip实例。 Sprite实例有一个调用click事件的子Button实例。

[object Main] (listening for MouseEvent.CLICK)
      |
      |__[object MovieClip]
                |
                |___[object Sprite]
                          |
                          |____[object Button] (dispatching MouseEvent.CLICK)

Button中发送的点击事件将是:

dispatchEvent(new MouseEvent(MouseEvent.CLICK, true));

在Main中,您只需要收听该事件:

addEventListener(MouseEvent.CLICK, clickHandler);

因为MouseEvent.CLICK是一个常见事件,我建议在这种类型的场景中创建一个自定义事件(或至少一个唯一的事件名称),以避免DisplayObject捕获不正确事件的可能性。但是,希望这能更好地了解如何处理冒泡。

-

没有冒泡,捕获事件的唯一方法是使用点语法。我不推荐这种方法,因为它可能会变得混乱,但这有助于说明冒泡的概念(假设每个子DisplayObject都是公共的):

在主要:(再次,不推荐)

movieClip.sprite.button.addEventListener(MouseEvent.CLICK, clickHandler);

希望有所帮助!

[编辑 - 添加自定义事件] 以下是自定义Event类的外观:

package com.example.events
{
    import flash.events.Event;

    public class CustomEvent extends Event {

        public static const WITH_DATA:String = "withData";

        public var data:Object;

        public function NavEvent(type:String, data:Object=null, bubbles:Boolean=false, cancelable:Boolean=false) {
            super(type, bubbles, cancelable);
            this.data = data;
        }
    }
}

然后您将发送一个类似的事件:

var myString:String = "buttonState";
dispatchEvent(new CustomEvent(CustomEvent.WITH_DATA, myString, true));

并听取以下事件:

addEventListener(CustomEvent.WITH_DATA, customEventHandler);

private function customEventHandler(e:CustomEvent):void {
    trace(e.data);
}