我有一個關於as3監聽器和一個類的實例的問題。AS3跨對象實例的監聽器 - 可能/好還是壞的做法?
主要的問題:有沒有辦法來分派從按鈕實例的事件以這樣的方式,其他按鈕實例可以收聽(而不需要在文檔類的監聽)
可以說我有一個文檔類和一個按鈕類。該文檔將有幾個按鈕類實例添加到顯示列表中。當選擇一個按鈕時,將調用set方法來將選中的包變量設置爲該實例。從這裏我想派遣一個事件來通知所有其他實例。
|document
|-button instance 1
|-button instance 2
|-button instance 3 (i want to send an event directly to instance 1 and 2...)
我目前的解決方案是創建一個ButtonGroup的類,即實例化的按鈕,按鈕會發送一個事件調用集團母公司。
|document
|-button group (catch the event and send an event to all instances within the group)
|---button instance 1
|---button instance 2
|---button instance 3 (dispatch the event)
但我的問題仍然是 - 如果我有多個組,我想事件發送到所有的組實例的..然後我就需要一個buttonManager類跟蹤組的(或至少,我這是怎麼理解的?)
|document
|-button manager (catch the event and send an event to all group instances)
|
|---button group 1
|-----button instance 1
|-----button instance 2
|-----button instance 3 (dispatch the event)
|
|---button group 2
|-----button instance 1
|-----button instance 2
|-----button instance 3 (dispatch the event)
我並不反對這些「解決方案」,我只是好奇,如果有另一種方式,或者其實我的解決方案是一個很好的做法。我的代碼的基礎坐在下面(減去按鈕管理器和組類)
我希望這是足夠描述,並且溫柔,我是OOP的新手...... 在此先感謝。
document.as
import flash.display.*;
import flash.events.*;
import myClasses.events.ButtonEvent;
public class Document extends MovieClip {
public function Document(){
trace("initialising Document...");
addEventListener(Event.ADDED_TO_STAGE, popStageVars);
}
private function popStageVars(e:Event){
trace("popping stage vars...")
var ob1:AbstractOBJ = new AbstractOBJ
var ob2:AbstractOBJ = new AbstractOBJ
var ob3:AbstractOBJ = new AbstractOBJ
addChild(ob1)
addChild(ob2)
addChild(ob3)
ob1.selected = ob1
ob2.selected = ob2
ob3.selected = ob3
}
}
Button類:
import flash.display.*;
import flash.events.*;
import myClasses.events.ButtonEvent;
public class ButtonOBJ extends MovieClip implements IEventDispatcher {
internal static var _selected:Object = null
public function ButtonOBJ(){
trace("initialising ButtonOBJ...");
addEventListener(Event.ADDED_TO_STAGE, popStageVars);
addEventListener(AbstractEvent.SET_CUR, checkClip);
}
private function popStageVars(e:Event){
trace("popping stage vars..." + this.name)
}
private function checkClip(e:AbstractEvent){
trace("checking button registered... " + this.name)
}
public function get selected():Object{
return _selected
}
public function set selected(s:Object):void{
var sName:String
if(selected != null){
sName = selected.name
}else{
sName = null
}
trace(this.name + " is changing the current selected from: " + sName + " - to: " + s.name)
_selected = s
dispatchEvent(new AbstractEvent(AbstractEvent.SET_CUR, true));
}
}
,也是buttonEvent:
package myClasses.events{
import flash.events.Event;
public class ButtonEvent extends Event {
public static const SET_CUR:String = "setSelected";
public static const VERSION:Number = 1.0;
public function ButtonEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) {
super(type, bubbles, cancelable);
}
public override function clone():Event {
return new ButtonEvent(this.type, this.bubbles, this.cancelable);
}
}
}
如果我理解正確 - 你說要添加一個監聽器到文檔類 - 但按鈕不會聽到,因爲事件冒泡到頂部,並從來沒有擊中其他實例 - 除非我錯了。 我遇到了這個問題:它迫使我跟蹤所有創建的按鈕(一個數組,通過調度調用方法調用實例來循環),並失去了我正在尋找的自我感知方法。這種方式基本上與組相同。 我喜歡保持所有的按鈕管理遠離文檔類... 如果我誤解了,你會介意詳細說明嗎? – Beans 2010-02-15 16:12:45
不是文檔類,而是舞臺。 stage.addEventListener();會在你的按鈕類中。 – typeoneerror 2010-02-15 16:50:41
福里斯特樹爲什麼?謝謝。我覺得那個失去了眼鏡的人只能在頭頂上找到他們。 作爲腳註 - 以這種方式添加舞臺監聽器,與組和管理器方法相比,它被認爲是不好的形式嗎? – Beans 2010-02-15 17:31:29