我有一个有很多孩子的父母(Canvas)(LinkButtons)
linkButtons触发事件以在它们之间进行通信:
dispatchEvent(new SameBookmarkEvent("SameBookmarkEvent", bookmark.name));
并且所有linkButtons都有一个监听器
this.addEventListener("SameBookmarkEvent", highlightMe);
...
private function highlightMe(e:SameBookmarkEvent):void {
//do something
}
现在,问题是该事件仅由调度员孩子监听。换句话说,只有触发事件的孩子正在接收它。我想知道它有什么问题,如果我应该向父母添加一个监听器(Canvas)......
我基本上需要孩子们(LinkButton)在他们之间进行交流
答案 0 :(得分:2)
是的,当您将按钮的侦听器添加到该对象中的函数时,当然只有该对象才会收到该事件。当您使用addEventListener
函数调用highlightMe
时,会传递对当前范围内highlightMe
函数的引用。这意味着引用该类中的私有函数。但是对于每个新类的实例,该函数是不同的。
在OOP中,每个对象都能为自己工作,并且不了解父母的任何信息,因此一个链接按钮不应该知道旁边有其他链接按钮以及这些按钮的作用。相反,父母知道有X个不同的链接按钮,每个按钮单独工作,但由父母管理以共同工作。从这个意义上说,在处理事件时,应始终将事件处理留在父对象中 - 除了自定义类具有保持标准过程正常工作的默认处理程序(如更改鼠标上的外观等),或者当您有自定义事件时封装其他事件。
因此,处理它的正确方法是在父类(实例化按钮)中有一个事件处理程序,然后它也能够识别事件与哪个按钮相关。
public class SomeParent extends Sprite
{
public function SomeParent ()
{
var btn:Button;
for ( var i:uint = 0; i < 100; i++ )
{
btn = new Button();
btn.label = 'Button ' + i;
btn.addEventListener( MouseEvent.CLICK, clickHandler );
this.addChild( btn );
}
}
private function clickHandler ( event:MouseEvent ):void
{
var btn:Button = event.eventTarget as Button;
trace( 'Button with id ' + this.getChildIndex( btn ) + ' and label "' + btn.label + '" was pressed.' );
}
}