2012-03-01 33 views
2

我有一個名爲shopView的自定義組件,它是一個MXML skinnable組件。我有一個名爲ShopController的控制器類,它負責在彈出窗口中顯示此組件,並更新組件中顯示的信息等。flex 4 - 爲什麼dispatchEvent觸發creationComplete遞歸

現在,我想在從控制器創建ShopView之後創建一些子組件的子組件後ShopView創建(creationComplete()事件)

所以,我已附加一個事件監聽器,實習生做一些初始化處理

creationComplete="init(event)" 

的init()函數

 private function init(event:FlexEvent):void{ 
      event.stopImmediatePropagation(); 
      initMenus(); 
      initSlots(); 
      dispatchEvent(event); 
     } 

從控制器類

 _shop.addEventListener(FlexEvent.CREATION_COMPLETE,onShopCreated); 

* _shop附另一個創建完整的事件是ShopView *

的情況下現在,如果你看到的init()函數,有我停止事件傳播,做一些初始化過程,之後我派遣事件(對於店鋪控制者做剩下的工作)

現在,這個我因爲ShopView的crationComplete事件被遞歸調用,所以會崩潰應用程序。我在想dispatchEvent會傳播給其他人,但好像它正在傳播回同一個組件。

我已經通過從init()函數中刪除e.stopImmediatePropagation()和dispatchEvent(event)行來修復它。但我想知道爲什麼會發生這種情況?

這是mxml/flex組件的已知問題嗎?或者它是預期的行爲?

更新:我沒有在.as中做同樣的事情,如下所述。得到的答案,基本上它我的愚蠢:)

,因爲我的時候我寫的。至於班,我 stopevent傳播和調度基於業務邏輯的事件還沒有看到這種行爲。

在此先感謝。

+1

你已經基本上創建了一個循環,它會繼續嘗試初始化你的應用程序。我同意takteek,你不應該停下來,然後重新創建完成。在你點擊init()時你的組件應該被添加到視圖堆棧中,所以在它上面設置屬性應該可以正常工作。 – Jeremy 2012-03-01 08:47:22

+1

基本上,在您刪除前面提到的代碼之前,您正在調度相同的事件,來自偵聽該事件的相同組件,以及來自剛纔由相同事件觸發的相同功能。因此無限循環。 – Jeremy 2012-03-01 08:51:59

回答

3

這是預期的行爲。

當您重新分派現有事件dispatchEvent時會自動克隆它(因爲您無法分派兩次相同的事件。)這將清除任何與傳播有關的標誌。

請問爲什麼要在這種情況下重新分配CREATION_COMPLETE?這兩個處理程序都能正常工作,而不需要刪除兩條線。

+0

我這樣做是因爲,當前的代碼沒有意義,因爲它在沒有停止和重新分派事件的情況下以完全相同的方式工作。但是我添加了它,因爲將來我會編寫一個代碼,其中創建完成不是從我的業務角度完成的,因爲它調用了異步函數,我需要在收到響應後調度創建完成。 – 2012-03-01 10:17:08

+1

您需要做的只是在preInitialize期間運行您的代碼,並在完成後觸發您自己的事件並從中運行代碼。 creationComplete具有特定的含義,並且劫持它是一個壞主意。 – 2012-03-01 13:04:56