Me again.
You are on the correct track with componentized apps, and there are MANY
ways to communicate between components. First, are you using "Modules"
with a capital "M"? that is, Flex 2.0.1 mx:Module tag? If so, you will
have to adjust what I say, since I have not used that approach yet. If
you are using the word "module" more generically, then read on.
The "best practice" approach to inter-component communication is to use
events. This "loose coupling" permits much more flexibility in reusing,
changing, maintaining components. But it is a little harder to
understand and implement. If you want to undertake this we can.
If are in a bit of a hurry to get your app working within a reasonably
componentized architecture, and understand that you are creating hard
coded dependencies between the components thae are simpler ways.
Obviously, there are two directions of communication, parent access of
child members, and child access of parent members. The simplest is
parent to child. If you give the child component an id, then you can
access any of its public member properties through that id reference.
For example, if your HTTPService code was in a component named
Thumbnail, you could do this:
<Thumbnail id="myThumbnail" .../>
Private function getData():void {
myThumbnail.srv.url = [EMAIL PROTECTED]; //assuming that xml node
was in this scope
myThumbnail.srv.send();
So you are halfway there, right?
Access of the parent scope from within a child is only a bit more
difficult.
I am fond of passing references into components. When you do this, you
can access all of the public members as though they were local. You can
set or retrieve values and call methods. (But remember, it locks in a
dependency.)
For example, say a display only component, that needs to talk the the
Application, and to the Thumbnail component:
public var dataSourceUrl:String = "http://myserver/mydatasource"
<MyDisplayComponent ... app="{this}" dataSource="{}" .../>
And in that component:
...
[Bindable]public var app:MyApplicationFileName; //tightly scoping this
is best
[Bindable]public var dataSource:Thumbnail; //tightly scoping
this is best
Private function initApp():void {
var sDataSourceUrl:String = app. dataSourceUrl;
dataSource.srv.url = [EMAIL PROTECTED]; //assuming that xml node
was in this scope
dataSource.srv.send();
This is simple, easy to implement and debug. But again, keep in mind it
limits component flexibility.
Tracy
________________________________
From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of shawn.gibson
Sent: Thursday, March 15, 2007 5:10 PM
To: [email protected]
Subject: [flexcoders] Unbelievably embarassing question - making
components talk (and modules) amongst
Thanks to Tracy's earlier help, I was able to get at least the ugly
(i.e., my) version of HTTPService going (and I'll revisit it to
Tracy's specs one I figure this here problem out), but in order for
me to do it, I had to de-compartmentalize all my code. In other
words, I have originally been using an approach where each
major 'page' was a module loaded into a state of my main app, and
each major chunk of a module was made of a custom component (the
entire Tree, it's code, the little stuff; or the entire thumbnail
with all it's itemrendering in a HorizontalList...etc)- nice
separation of code, easy to understand in 6 months, and no 6,000 line
files. Also offered me a fighting chance in the future to figure out
model, control, and view separation.
But for me to get (for example) the tree component I made to
communicate with the thumbnail component, both housed in the
galleries module, I had to hardcode the components back into the
module (i.e., they are no longer components), so the module is now
one big-ass file that has no components, they are right in the file.
I can't go on like this, it's just too ugly. As a designer and a poet
wannabe, that sucks LOL.
But I can't for the life of me get things to talk amongst themselves,
say my module has 3 custom components doing their things...how do I
access something in one component from another component?
I became very afraid when I realized there doesn't seem to be any
kind of AS2/Flash dummy-movie approach - loadMovie ('thisthing') into
dummyclip instance 'whatever' and suddenly you just say
whatever.thisthing.stuff, and you've gained access to everything. In
other words, you can jump up and down as long as you know the scope.
I haven't a clue what the equivalent is in Flex 2.
It's very embarassing. I refuse to get through this weekend without
figuring it out. I'm not botching my gallery project by having 5-6
modules (as I DO want) but with thousands of hardcoded chunks within
them, when each module should by rights have nice piecemealed (sorry
for the word) custom components doing their thing from their own file
and from there communicating with each other. I need to use
components in the modules for my own sanity, and even worse, how do I
get one module to talk to another module's objects, functions, etc.?
In a word, you can't go from:
[EMAIL PROTECTED];
srv.send();
...strip it out into a component and then call the id of the parent,
i.e.:
[EMAIL PROTECTED];
thumbloader.srv.send();
...you get "Access of undefined property thumbloader" for your
troubles...
You can't back up a generation like you could with Flash. Or if you
can, I'm missing big bits of the puzzle.
Any suggestions, other than take a chill-pill?
Thanks guys,
Shawn