Изменение дочернего компонента в другом компоненте в повторителе - PullRequest
0 голосов
/ 10 ноября 2010

У меня есть пользовательский компонент в повторителе.Этот компонент имеет дочерний компонент, который может быть двух типов в зависимости от некоторых условий.Я использовал UIComponent в качестве заполнителя.

В повторном компоненте, скажем, RepeatedComponent:

<mx:VBox>
   <mx:UIComponent id="placeHolder"/>
</mx:VBox>

И я делаю это в компоненте, имеющем повторитель:

// Function where I try to inject the child component :
private function getComponent():UIComponent{
            if(condition)
            {
                return new ChildComponentA(); 
            }
            else
            {
                return new ChildComponentB();
            }


    ]]>
</mx:Script>
<mx:VBox>

    <mx:Repeater id="repeteur" 
                 recycleChildren="true" 
                 dataProvider="{arrayBeneficiaires}" >

        <components:RepeatedComponent id="repeatedComponent"
                                      beneficiaire="{repeteur.currentItem}"
                                      placeHolder="{getComponent()}"/>

    </mx:Repeater>
</mx:VBox>

Когда я размещаю точки останова в функциях, вызываемых в creationComplete, я вижу, что компонент, назначенный для placeHolder, является правильным, но он не отображается на моем дисплее.Я попытался обновить, вызывая invalidateDisplayList в каждом месте, о котором я могу думать, но это, похоже, не работает.Любые идеи будут приветствоваться.

Спасибо

1 Ответ

0 голосов
/ 10 ноября 2010

Я подозреваю, что проблема в том, что значение getComponent() никогда не добавляется на сцену. то есть - установка значения placeHolder на что-то не то же самое, что вызов addChild (getComponent ()).

Следовательно, будет работать следующее:

 <mx:Repeater id="repeteur" 
             recycleChildren="true" 
             dataProvider="{arrayBeneficiaires}" >

    <components:RepeatedComponent id="repeatedComponent"
                                  beneficiaire="{repeteur.currentItem}"
                                  creationComplete="getComponent(repeatedComponent)"/>

</mx:Repeater>




 private function getComponent(parent:RepeatedComponent):void {
        if(condition)
        {
            parent.addChild(new ComponentA());
        }
        else
        {
            parent.addChild(new ComponentB()); 
       }
  }

Обратите внимание, что в этом сценарии вам не нужен UIComponent placeHolder (который на самом деле не служит какой-либо цели).

Однако я рекомендую перенести эту логику внутрь RepeatedComponent, так как кажется, что это решение является ответственностью компонента, а не родителя.

Тогда код становится намного чище:

 <mx:Repeater id="repeteur" 
             recycleChildren="true" 
             dataProvider="{arrayBeneficiaires}" >

    <components:RepeatedComponent id="repeatedComponent"
                                  beneficiaire="{repeteur.currentItem}" />

</mx:Repeater>


<!-- RepeatedComponent.mxml -->
<mx:VBox>
   <mx:UIComponent id="placeHolder"/>
</mx:VBox>

<mx:Script>
     private var _beneficiaire:Object
     public function get beneficiaire():Object {
         return _beneficiaire;
     }
     public function set beneficiaire(value:Object):void {
          _beneficiaire = value;
          createSubComponent();
     }
     private function createSubComponent():void
        if(condition)
        {
            parent.addChild(new ComponentA());
        }
        else
        {
            parent.addChild(new ComponentB()); 
        }
    }

</mx:Script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...