【问题标题】:adding functionality to nested components向嵌套组件添加功能
【发布时间】:2011-05-03 16:41:34
【问题描述】:

好的。情况是这样的……

我有一个自定义的 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';
            }
        }

谢谢, 杰米

【问题讨论】:

  • 只是想解决您的问题。冒泡单击事件并在 Main.mxml 中添加侦听器会解决问题。或者,您可以只发送一个自定义事件来传递您需要的数据吗?
  • Corey,感谢您的回复。请原谅我的无知。我是一个自学成才的新手,还没有学会冒泡。我阅读了 AS3 参考指南,但仍然不完全理解。冒泡是否允许我直接从我的 Main.mxml 引用点击事件?如果是这样,我该如何设置?我的猜测是设置 bubbles = true,然后在 Main.mxml 中放置一个事件监听器?示例代码会有所帮助。谢谢。

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


【解决方案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 都是公共的):

在 Main:(再次强调,不推荐)

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);
}

【讨论】:

  • 我是否将 dispatchEvent 放在 if 语句中?我只希望它在组件处于 state3 或 state4 时调度。另外我如何给事件一个唯一的名称?我试过dispatchEvent(new MouseEvent("onSubmitClick", true)); Eclipse 没有显示任何语法错误,但它也没有工作。 :)
  • 你可以从 if 语句中调度。但是,您将需要另一种方法来确定组件处于哪个“状态”。这是自定义事件会有所帮助的地方。我在上面添加了一个自定义事件和用法的示例。
  • 再次感谢科里。我花了一段时间才明白你向我展示的内容,但在我的 Java 朋友的一点帮助下,我们让它全速运转。呜呜!!!
猜你喜欢
  • 1970-01-01
  • 2014-11-15
  • 2012-08-12
  • 2017-11-19
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多