Instead of directly accessing the children, which could lead to complex code 
which would be prone to failure and difficult to modify, try using a Facade 
object, implemented as either a singleton or using injection (if you happen to 
be using a framework which supports it).  I recommend a singleton facade for 
this purpose, since it is more decoupled.  you can reference it as a simple 
IEventDispatcher, eliminating the need to bind your child components to a 
specific class definition.

listen for an event such as UPDATE_SUPER_TAB_CHILD_DATA:String = 
"updateSuperTabChildData";

define the event to have "tabChildId:String" property in the constructor.  then 
you match the event.id against this.id and you determine if you need to act on 
the event and listen for it in all children.

If there are too many children for this quick/dirty approach to be effective 
you can use a more complex subscriber pattern, and use a singleton bus and have 
the child "register" itself as a subscriber, providing a unique id (or 
recycling subscriberObject.id - which would be the exact component you are 
trying to locate below).  then you can have a method in the bus class with the 
prototype:
    public function updateChildData(childID:String):void {
        for each(var child:IVisualElement in subscribers) {
            if(child.id == childID) {
                child.dispatchEvent(new Event("updateYourData"));
                break;
            }
        }
    }

There are lots of ways to do it, but navigating from the top down to a specific 
child is not recommended since the children may or may not be fully 
constructed.  I recommend that to ensure full subscription that you either use 
an ActionScript class and instantiate and add them during the existing flex 
lifecycle of the parent object, or if you must use an mxml for some reason, 
expose an "initDataHandlers" public method and still create them in 
actionscript and initDataHandlers on the child object and then add them as 
children of the super grid.

I'm sure that one of or a combination of these recommendations will get you 
right where you want to be.

Good luck.
David

> Date: Tue, 29 Oct 2013 21:09:11 -0400
> Subject: Getting SuperTabNavigator child
> From: oleg...@gmail.com
> To: flex-...@incubator.apache.org
> 
> Hi,
> 
> I have several components (Box with DataGrids) added as children to
> SuperTabNavigator.
> Need to get a handle to such child component to refresh its DataGrid's data
> (or possibly to close it and open another one like that with new data).
> 
> So how can I get a handle to the child of SuperTabNavigator?
> 
> -- 
> Thank you in advance,
> Oleg.
                                          

Reply via email to