Flex 4 - Как перебрать дочерние элементы контейнера, когда они зависят от состояния - PullRequest
2 голосов
/ 18 августа 2011

Новые состояния Flex переопределяют визуальные элементы, помеченные includeIn / excludeFrom.Если у меня есть группа (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 ]

2 голосов
/ 18 августа 2011

Если вы хотите, чтобы штаты управляли видимым / 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>
2 голосов
/ 18 августа 2011

У меня похожая ситуация в одном из моих приложений, и вот как я справился.Я чувствую себя обязанным сказать, что, хотя это работает, я чувствую, что это немного глупо.Имея это в виду:

  1. Создайте другое состояние, назовем его cheating.Сделайте это состояние по умолчанию (поместите его первым в массиве states.
  2. Обновите все ваши представления, чтобы включить в это состояние.
    Например, <shipping:OrderShipping id="view1" includeIn="cheating,view1State" />
  3. Создатьновый член класса типа Array с именем views.
  4. Добавьте обработчик события creationComplete. В обработчике введите views со ссылками на каждое из представлений. Например, views = [view1, view2, view3, view4];
  5. Измените состояние на ваше «первое» (не cheating) состояние: setCurrentState("view1State");

После всего этого ваш массив views будет содержать ссылки на каждое из представлений независимо отв каком состоянии находится ваша заявка.

1 голос
/ 18 августа 2011

Я получил лучший ответ! Хорошо, я позволю тебе решить. Просто работайте с массивом состояний ...

 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);
    }

}
1 голос
/ 18 августа 2011

Я не уверен, что реализация базового состояния удаляет / добавляет дочерние элементы к компоненту или изменяет их видимость.

Если первое, я бы попробовал что-то вроде этого:

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

Полагаю, первый подход правильный.

[Обратите внимание, я написал этот код в браузере]

...