Показать сообщение отдельно
Старый 02.11.2006, 21:58
  № 1  
Ответить с цитированием
Zeiss
Guest

Сообщений: n/a
Question Enumerate children. Как "пробежаться" по детям моего компонента?

Необходимо по окончании создания компонента пробежаться по его дочерним элементам с прикладной целью.
Ни в childrenCreated(), ни в creationComplete они недоступны (numChildren == 0). Та же картина в событии Added, а если отнаследоваться от Container, то событие childAdd не вызывается.
Компонент наследует UIComponent (Container, VBox etc - проблему не решают). Если рядом с "невизуальным" HTTPService бросить кнопку - всё равно, она недоступна (getChildAt()).

Беда. Вообще, между нами, что-то на флексе та-а-ак туго всё даётся… Удивительно.

Код:
package com.mirabile.business {
import com.adobe.cairngorm.business.ServiceLocator;

import flash.display.DisplayObject;
import flash.events.Event;

import mx.containers.Box;
import mx.core.Container;
import mx.core.IChildList;
import mx.core.UIComponent;
import mx.events.ChildExistenceChangedEvent;
import mx.events.FlexEvent;
import mx.rpc.AbstractService;
import mx.rpc.http.mxml.HTTPService;

public class ServiceAddon extends UIComponent // или Container или VBox или whatever else
{
   
   private var locator: ServiceLocator = ServiceLocator.getInstance();
   
   public function ServiceAddon(){
      super();
      addEventListener(Event.ADDED, created);
      addEventListener(mx.events.ChildExistenceChangedEvent.CHILD_ADD,
                       childAdded); // НЕ СРАБАТЫВАЕТ
   }

   override protected function childrenCreated():void{
      super.childrenCreated();
      addServices();
   }
   
   private function childAdded(event: ChildExistenceChangedEvent): void{
      checkChild(event.relatedObject);
   }
   
   private function created(event: Event): void{
      addServices();
   }
   
   private function addServices(): void{
      var count: int = numChildren;
      for (var i: int = 0; i < count; i++){
         var obj: DisplayObject = getChildAt(i);
         checkChild(obj);
      }
   }

   private function checkChild(obj: *): void{
      if (obj is HTTPService){
         locator[obj["id"]] = obj;
      } else if(obj is AbstractService){
         locator[AbstractService(obj).id] = obj;
      }
   }
}
}
Код:
<?xml version="1.0" encoding="utf-8"?>
<mirabileBusiness:ServiceAddon 
   xmlns:mx="http://www.adobe.com/2006/mxml" 
   xmlns:mirabileBusiness="com.mirabile.business.*" 
   xmlns:cairngorm="http://www.adobe.com/2006/cairngorm">
   
   <mx:HTTPService id="galleryService"
      showBusyCursor="true" 
      method="GET" resultFormat="xml"
      contentType="application/xml"
      requestTimeout="15"
      url="assets/data/dumbxml.php"
      result="event.token.resultHandler(event);" 
      fault="event.token.faultHandler(event);" /> 

</mirabileBusiness:ServiceAddon>