Update
I was thinking that maybe the reason the below did not work was because
I was adding the event listener before the object was added to the
display, so I moved the event handler addition after adding modContainer
to workspace_canvas. Unfortunately that did not help. Updated function
follows:
private function moduleLoadComplete(event:ModuleEvent):void
{
// The module itself as a Display Object.
var visual:DisplayObject = event.module.factory.create() as
DisplayObject;
// The module container.
var modContainer:ModuleWrapper = new ModuleWrapper();
modContainer.id = "module_container" + this._moduleIndex;
// Add module to the container.
modContainer.addChild(visual);
// Add module container to workspace canvas.
root_canvas.workspace_canvas.addChild(modContainer);
// Add event listeners to the modContainer.
modContainer.addEventListener("profileDataUpdated",profileDataUpdatedHan\
dler);
this._moduleIndex++;
}
--- In [email protected], "brett.hitzel" <[EMAIL PROTECTED]>
wrote:
>
> Thanks for the reply and apologies for the late response.
>
> Unfortunately, your second idea may not be practical in my application
> as it will only be certain modules listening for these events (what
> modules listen to what events would be determined at load time as an
XML
> configuration file is loaded).
>
> I have tried your other idea, setting the event listener on the module
> as it is being dynamically created and then dispatching the event from
> the parent, unfortunately that did not seem to work. Code samples
below:
>
> RootApplicationFunctions.as(script included on root most application
> file so this would be the "parent application")
> * NOTE: This function is a couple functions down the chain,
originating
> from a loop which is iterating over the XML configuration file. It
tells
> the applications what modules to load. *
> private function moduleLoadComplete(event:ModuleEvent):void
> {
> // The module itself as a Display Object.
> var visual:DisplayObject = event.module.factory.create() as
> DisplayObject;
> // The module container.
> var modContainer:ModuleWrapper = new ModuleWrapper();
> modContainer.id = "module_container" + this._moduleIndex;
> // Add event listeners to the modContainer.
>
>
modContainer.addEventListener("profileDataUpdated",profileDataUpdatedHan\
\
> dler);
> // Add module to the container.
> modContainer.addChild(visual);
> // Add module container to workspace canvas.
> root_canvas.workspace_canvas.addChild(modContainer);
> this._moduleIndex++;
> }
>
> private function sendEvent():void
> {
> dispatchEvent(new Event("profileDataUpdated"));
> }
>
> I did know if it would be looking for profileDataUpdatedHandler in the
> parentApplication or in the moduleWrapper as file itself, so at
present
> this function exists in both spots:
>
> public function profileDataUpdatedHandler(event:Event):void
> {
> Alert.show("module container heard the event: " +
> event.target.toString());
> }
>
> RootApplication.mxml (this is the file which includes
> RootApplicationFunctions.as above)
> <?xml version="1.0" encoding="utf-8"?>
> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
> xmlns:view="view.*"
> layout="absolute"
> width="100%"
> height="100%"
> creationComplete="rootApplicationInit()">
>
> <mx:Style source="asset/style/CommunityUI.css" />
>
> <mx:Script source="RootApplicationFunctions.as" />
>
> <mx:XML id="OEMConfiguration" source="xml/oemConfiguration.xml"
/>
>
> <view:RootCanvas id="root_canvas" />
> <mx:Button click="sendEvent()" />
> </mx:Application>
>
>
> As of yet, I have not been able to get this to work. If I click on the
> button on the root, it does fire sendEvent(), but module being loaded
is
> not responding (technically it is the ModuleWrapper listening, but the
> ModuleWrapper passes instructions to the module contained within).
>
> I have other options available to me I suppose, however this is the
way
> I would like to do it because it seems like the cleanest way.
>
> --- In [email protected], "phipzkillah" phil@ wrote:
> >
> > It's possible.
> >
> > Main.mxml
> > //script
> > private function init():void{
> > child1.addEventListener("change",
> callBackFunction);
> > }
> >
> > private function dispatchEventsToChildren():void{
> > //call this to dispatch an event
> > dispatchEvent(new Event("change"));
> > }
> >
> > //or do it this way
> > private function
controlChildren(event:ItemClickEvent):void{
> > child1.publicFunctionUpdateData(args);
> > }
> >
> >
> > //body
> > <com:child1 id="child1"/>
> > <mx:DateField change="controlChildren(event)"/>
> >
> >
> > Child1.mxml
> > Some component you have...
> >
> >
> > --- In [email protected], "brett.hitzel" brett.hitzel@
> > wrote:
> > >
> > > Hi Everyone,
> > >
> > > I have been charged to architect a fairly large scale Flex
> application
> > > (first time doing so). I don't think that my issue warrants code
> > > samples however if needed I can provide.
> > >
> > > I have not worked with events too much, but I understand the
default
> > > three phases it goes through (capture,target,bubble). The
> application
> > > will be comprised of an application which load a custom MXML
> component
> > > (basically an extended Canvas), which in turn loads modules based
on
> > > user interaction. What I need to have happen, is when the root
> > > (parentApplication) has values that update, I would like for it to
> > > dispatch an event, which the Modules listen for, and then in
> response
> > > poll the parent for that data to get the new information.
> > >
> > > Based on everything I have read, events don't propigate in that
> > > direction (it climbs down the chain from the top, hits the target,
> and
> > > then climbs back up). However, is it possible to make it go the
> other
> > > way? Can children hear events of the parent? If this is
impossible,
> > > does anyone have any thoughts or suggestions for an alternative to
> my
> > > particular problem?
> > >
> > > I appreciate any advice you can offer!
> > >
> >
>