2011-05-03 77 views
1

O.K.这里的情况...为嵌套组件添加功能

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

+0

只是试图将m你可以回避你的问题。冒泡点击事件并在Main.mxml中添加监听器可以解决问题。或者,您是否可以派遣自定义事件来传递您需要的数据? – Corey 2011-05-03 17:30:29

+0

科里,谢谢你的回应。原谅我的无知。我是一个自学成才的新手,并没有学会冒泡。我阅读AS3参考指南,但仍然不完全明白。 Bubbling是否允许我直接从我的Main.mxml中引用click事件?如果是这样,我该如何设置它?我的猜测是设置bubbles = true,然后在Main.mxml中放置一个事件监听器?示例代码会很有帮助。谢谢。 – 2011-05-03 23:11:26

回答

1

如果你有机会到调度事件的按钮,只需将“泡沫”到“真”并在Main.mxml中监听事件。如果您将显示列表视为具有分支的分层树,则会出现一个事件,即气泡将沿分支前进,直到它到达第一个DisplayObject。一路上,它检查每个DisplayObject以查找它是否在等待捕获事件。

这里是一个基本的例子,其中Main正在监听点击事件,并且有一个带有子Sprite实例的子MovieClip实例。 Sprite实例具有调度单击事件的子Button实例。

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

按钮,在派出点击事件:

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

在主,你只需listend的事件:

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

我是否在if语句中放置dispatchEvent?如果组件处于state3或state4,我只希望它派遣。我该如何给这个活动一个独特的名字?我尝试了'dispatchEvent(new MouseEvent(“onSubmitClick”,true));'Eclipse没有显示任何语法错误,但它也不起作用。 :) – 2011-05-05 23:05:19

+0

您可以从if语句派发。但是,您需要另一种方法来确定组件处于哪个“状态”。这是自定义事件的帮助。我已经在上面添加了自定义事件和用法的示例。 – Corey 2011-05-06 15:02:03

+0

再次感谢科里。我花了一段时间才把自己的头围绕在你展示给我的东西上,但在我的Java朋友的一点帮助下,我们得到了它在所有气瓶上的射击。哇噢! – 2011-05-13 09:46:41