2011-08-17 52 views
2

Flex的新狀態會重新標記包含includeIn/excludeFrom的可視項目。如果我有一個Group(MainGroup)擁有5個受控制的子/元素,那麼仍然有辦法獲得對MainGroup的子項的引用嗎? mainGroup.numChildren和mainGroup.numElements不起作用,因爲子對象已重新生成父對象。充其量,他們顯示1.Flex 4 - 當狀態依賴於容器的子集時,如何循環使用容器

<s:states> 
    <s:State name="view1State" /> 
    <s:State name="view2State" /> 
    <s:State name="view3State" /> 
    <s:State name="view4State" /> 
</s:states> 

<s:Group id="mainGroup"> 
    <shipping:OrderShipping id="view1" 
      includeIn="view1State" /> 
    <payment:OrderPayment id="view2" 
      includeIn="view2State" /> 
    <verification:OrderVerification id="view3" 
      includeIn="view3State" /> 
    <confirmation:OrderConfirmation id="view4" 
      includeIn="view4State" /> 
</s:Group> 
+0

注意:「重新註冊父母」實際上只是讓父母註銷。這裏是一個可視化項目更改的屬性已經由一個國家的變化刪除: 這裏是一個可視化項目更改的屬性已經由一個國家的變化刪除: - automationOwner:空, - automationParent:空, - baselinePosition:NaN時, - 文件:空, - 過濾器:空, - 的FocusManager:空, - 聽衆:空, - 的LoaderInfo:空, - nestLevel爲:0, - 業主:空, - parent:null, - parentChangedFlag:true, -parentDocument:null, -systemManagerDirty:true –

回答

1

我得到了最好的答案!那麼,我會讓你決定。只需在狀態數組上操作...

for each (var viewState:State in mainDocument.states) 
{ 
    var overrides:Array = viewState.overrides; 

    for (var i:int = 0; i < overrides.length; i++) 
    { 
     var addItems:AddItems = overrides[i]; 
     if (addItems.destination === mainDocument.mainGroup) 
      trace((addItems.items as UIComponent).name); 
    } 

} 
+0

@ NoobsArePeople2,這與您的解決方案非常相似。很高興知道Adobe放置它的位置,並可能保存一些代碼行。注意:它只包含已創建的項目。所以延期安置仍然適用。 –

1

我不確定底層的狀態實現是否刪除/添加子項到組件或更改其可見性。

如果是前者,我想嘗試這樣的事:

for (var x : int = 0; x<mainGroup.numChildren ; x++){ 
var child : UIComponent = mainGroup.getChildAt(x); 
if(child.parent){ 
    // The child has a parent, so it must be displayed; do your processing 
} else { 
    // really this should never occur 
} 
} 

如果是知名度的問題,那麼這樣做:

for (var x : int = 0; x<mainGroup.numChildren ; x++){ 
var child : UIComponent = mainGroup.getChildAt(x); 
if(child.visible){ 
    // The child is displayed; do your processing 
} else { 
    // child isn't displayed 
} 
} 

我猜第一種方法是正確的一個。

[注我在瀏覽器中寫了這個代碼]

+0

問題是numChildren始終爲0或1,因爲只顯示一個組件。其他人重新參與,不再在mainGroup中,直到他們的includeIn狀態匹配當前狀態爲止。 includeIn/excludeFrom不僅設置可見性和includeInLayout,這對我來說真的很奇怪。 –

+0

@Tony Smith我以爲那是你想要的;獲取組件的孩子。這聽起來像是你想要得到所有可能的孩子;不是所有現在的孩子?從原來的問題來看,我完全不清楚這一點。是這樣嗎? – JeffryHouser

+0

哦,對不起,我會盡量讓下一次更清楚。所以在我的例子中,我試圖遍歷mainGroup的所有子節點,視圖1-4。儘管我發現了一個非常酷的解決方案,如下所示。 –

2

如果你想狀態來控制可見光/ includeinlayout而不是父母,只是做了這樣的

<s:states> 
    <s:State name="view1State" /> 
    <s:State name="view2State" /> 
    <s:State name="view3State" /> 
    <s:State name="view4State" /> 
</s:states> 
<s:Group id="mainGroup"> 
    <shipping:OrderShipping id="view1" 
     visible="false" 
     includeInLayout="false" 
     visible.view1State="true" 
     includeInLayout.view1State="true"/> 
    <payment:OrderPayment id="view2" 
     visible="false" 
     includeInLayout="false" 
     visible.view2State="true" 
     includeInLayout.view2State="true"/> 
    <verification:OrderVerification id="view3" 
     visible="false" 
     includeInLayout="false" 
     visible.view3State="true" 
     includeInLayout.view3State="true" /> 
    <confirmation:OrderConfirmation id="view4" 
     visible="false" 
     includeInLayout="false" 
     visible.view4State="true" 
     includeInLayout.view4State="true"/> 
</s:Group> 
+0

啊,老skool和新skool的一個有趣的組合。仍然有點黑客IMO,但肯定是一個可行的解決方案。其中一個缺點是你將不再獲得延期安裝的好處。 –

2

我有一個類似的情況我的應用程序,這就是我的成就。我覺得有必要說,雖然這有效,但我覺得這有點不好意思。有鑑於此:

  1. 創建另一個狀態,我們將其稱爲cheating。使這種狀態下,默認的(把它先在你states陣列。
  2. 更新你所有的意見,包括在此狀態。
    例如,<shipping:OrderShipping id="view1" includeIn="cheating,view1State" />
  3. 創建一個名爲viewsArray類型的新類成員。
  4. 與引用的狀態添加creationComplete事件處理程序在處理程序populdate views到每個視圖例如,views = [view1, view2, view3, view4];
  5. 更改爲你的「第一次」(非cheating)狀態:。setCurrentState("view1State");

畢竟這是你的views陣列將有每個視圖引用無論哪個國家你的應用是目前英寸

+0

這確實是一個有趣的解決方案。我能看到的唯一問題是數組可能持有對否則將被GCed的引用。我喜歡這個主意。我想我會用weakKeys = true的字典來代替數組。現在,我甩環路和硬編碼它:-( '如果(廠景) \t \t(如廠景IViewResetable).resetView(); \t如果(視圖2) \t \t(如視圖2 IViewResetable)。 resetView(); \t如果(VIEW3) \t \t(VIEW3如IViewResetable).resetView(); \t如果(view4) \t \t(view4如IViewResetable).resetView(); \t如果(view5) \t \t(view5 as IViewResetable).resetView();' –

+0

是的,'Dictionary'可能是GC的更好選擇。在我的具體情況中,我不需要擔心它,因爲我的視圖是在應用程序啓動時創建的,只有在它退出時纔會銷燬。 – NoobsArePeople2