1

好的,情况就是这样……

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

仅供参考:该组件有 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

4

1 回答 1

1

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

这是一个基本示例,其中 Main 正在侦听单击事件,并且有一个子 MovieClip 实例和一个子 Sprite 实例。Sprite 实例有一个子 Button 实例,它正在调度点击事件。

[object Main](监听 MouseEvent.CLICK)
      |
      |__[对象影片剪辑]
                |
                |___[对象精灵]
                          |
                          |____[对象按钮](调度 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);

希望有帮助!

[编辑 - 添加自定义事件] 这是自定义事件类的样子:

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);
}
于 2011-05-04T15:30:33.100 回答