Flex 4 - 当容器的状态依赖时,如何循环容器的子容器

时间:2011-08-17 20:34:41

标签: flex elements children states

Flex的新州重新加入了标有includeIn / excludeFrom的视觉项目。如果我有一个Group(MainGroup),其中包含5个受状态控制的子元素/元素,是否还有办法获取对MainGroup子元素的引用? mainGroup.numChildren和mainGroup.numElements不起作用,因为子项是重新父级的。充其量,他们显示1。

<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>

4 个答案:

答案 0 :(得分:2)

如果你想要状态来控制visible / 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>

答案 1 :(得分:2)

我的一个应用程序中有类似的情况,这就是我完成任务的方式。我觉得有必要这样说,虽然这有效,但我觉得它有点笨拙。考虑到这一点:

  1. 创建另一个州,我们称之为cheating。将此状态设为默认状态(将其放在states数组中。
  2. 更新您要包含在此状态的所有观看次数 例如,<shipping:OrderShipping id="view1" includeIn="cheating,view1State" />
  3. 创建名为Array的<{1}}类型的新类成员。
  4. 添加views事件处理程序。在处理程序populdate creationComplete中引用每个视图。例如,views
  5. 将状态更改为“第一个”(非views = [view1, view2, view3, view4];)状态:cheating
  6. 毕竟,setCurrentState("view1State");数组将引用每个视图,无论您的应用程序当前处于哪种状态。

答案 2 :(得分: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
 }
}

我猜第一种方法是正确的。

[注意我在浏览器中写了这段代码]

答案 3 :(得分: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);
    }

}