ViewStack 的自動創建子項策略 creationPolicy

和UIComponent的states不同,ViewStack默認的創建策略creationPolicy=“auto”,並非跳轉到某一頁後,才創建INavigatorContent子項。


實際上,在ViewStack 被addChild到舞臺顯示列表,initialize方法被調用時,ViewStack就會創建所有的INavigatorContent子項,addChild到自身顯示列表,調用各子項的initialize方法創建子項內容,不過除了當前顯示的子項,並不會創建其他子項容器的子元素(INavigatorContent的實現器,mx Container和spark NavigatorContent,都是一個容器組件),會等到第一次跳轉到指定容器時,創建該容器的所有子元素。


另外,作爲ViewStack的INavigatorContent子項的具體組件,mx Container和spark NavigatorContent又有一些差別。

Container在被ViewStack addChild後,initialize方法執行完畢創建內容之後時,並不會調度initialize事件,因爲Container覆蓋了initializationComplication方法(該方法繼承自UIComponent,會調度initialize事件),改成空方法。

而NavigatorContent沒有覆蓋這一方法。


所以,ViewStack在一開始就創建了所有INavigatorContent子項後,mx Container容器組件不會調度initialize事件,而是等到ViewStack第一次跳轉到該子項頁,容器創建所有子元素組件之後,才調度initialize事件,而NavigatorContent容器組件,在一開始被ViewStack addChild後,子元素組件還沒有創建時,就調度了initialize事件,這時,該NavigatorContent容器所有子元素組件都尚未創建


結論:如果要讓ViewStack中的某個子項——一個INavigatorContent容器組件,在其容器子元素全部創建完成後,或者ViewStack第一次轉到該容器組件頁後進行某種操作(如從遠程服務器獲取數據),則不能依賴INavigatorContent容器的initialize和creationComplete事件,因爲spark NavigatorContent容器組件在調度initialize事件時,容器子元素尚未創建(經進一步測試,spark NavigatorContent調度creationComplete事件時,其子元素組件仍未創建),需要重寫Container或是SkinnableContainer的createDeferredContent方法,在調用super.createDeferredContent後進行所需操作

另外還可以使用INavigatorContent的show事件,createDeferredContent只會執行一次,而show事件,會在每次切換到該容器時調度(也就是說,切換到某一容器,並不是addChild,removeChild某容器,而是設置容器的visible屬性)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章