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