2009-12-15 55 views
1

考慮這個(僞代碼)事件:AS3 - 分派DOWN顯示列表(而不是向上)

var country = new Country(); 
addChild(country); 

var state = new State(); 
country.addChild(state); 

var city = new City(); 
state.addChild(city); 

我可以從城市調度事件到國家像這樣(在市級):

dispatchEvent(new CustomEvent(CustomEvent.WHATEVER)); 

因爲事件冒泡顯示列表。但是,我怎樣才能從COUNTRY類派遣一個活動讓這個城市聽到呢?當我將事件聽衆添加到城市時,來自國家的事件派發不會註冊。

回答

1

可能並不理想,但我只是將偵聽器添加到子對象內部的舞臺上,所以它在事件冒泡到舞臺時捕獲該事件。

0

您可以通過引用父級的父級將城市設置爲偵聽器。

class City extends Sprite 
{ 
    public function City() 
    { 
     this.addEventListener(Events.ADDED_TO_STAGE, this.foo()); // P.S. Verify event type. This is over the top of my head. 
    } 

    private function addedToStage(e:Event):void 
    { 
     this.parent.parent.addEventListener(Country.EVENT_TYPE, this.foo()); 
    } 

    private function foo(e:Event):void 
    { 
     // Handle event 
    } 
} 

現在所有這些都很花哨,但是可能有更好的方法來構建您的代碼。現在,你有一個循環依賴,如果不正確清理可能導致內存泄漏。如果你能詳細說明你的要求,有人可能會提出一種替代方法。

+0

嗯,它可能會超過2級,所以我不想沿着父母親的路走下去。必須有更好的方法讓對象「下」顯示列表來監聽事件? – phil

+1

你似乎在這裏建立某種層次結構。在這種情況下,您應該有一個定期的消息傳遞模式,而不是讓任意節點爲他們的父母設置監聽器。查看樹視圖的實現來理解我的意思。 如果你確實走了這條路線,那麼你應該讓國家節點在列表中存儲對其子節點的引用,然後在必須觸發事件時遍歷列表。子節點將類似地具有其自己的子節點的列表並將消息傳遞給每個節點。 該方法消除了循環依賴性,並且易於維護。 –

0

您可以使用單例eventdispatcher類,在這種情況下可能會非常方便。

相關問題