Hi, Tracy.
Nice writeup! I have a few comments...
1. The phrase "sibling child controls" seems confusing to me. You might
have a structure like
<Application>
<MyTextInput id="myTextInput"/>
<HBox>
<MyButton id="myButton"/>
...
</HBox>
</Application>
which creates myTextInput and myButton as "sibling" reference vars in
the application's scope, despite the fact that the MyTextInput and
MyButton instances aren't siblings in the DisplayObject hierarchy the
MyButton instance isn't a direct child of the application.
Also, saying that the controls share the same scope -- as opposed to
their reference vars being in the same scope -- could make some people
think that the scope for MyTextInput's <Script> and MyButton's <Script>
is the same, which isn't true.
I'd make it clear that the ids of all tags inside the component being
defined correspond to reference variables in the scope of that
component. And that that both the component's <Script> -- and the event
handler attributes on any of its child tags -- execute in that scope.
2. You generally need to use parentDocument, not simply parent, to reach
up the document chain. For example, a method in MyButton's script would
use parentDocument to call a method in Application's script.. If it used
parent it would get the HBox, not the Application.
3. From a loaded application, you use parentApplication to access the
app that loaded it.
Gordon Smith
Adobe Flex SDK Team
________________________________
From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of Tracy Spratt
Sent: Tuesday, April 22, 2008 7:08 PM
To: [email protected]
Subject: RE: [flexcoders] passing parameters to components
There are many ways. Below is a document I started, but have not
polished, but should be of some use.
Tracy
Communicating between Components:
Note: for "loose coupling" use events. But that is another topic.
A non-trivial flex application is "component" based. While all of the
built-in controls are components, the question of communicating between
components most often arises when you are using a custom component. A
custom component, whether implemented in mxml or ActionScript, has its
own "scope". Within that component (Application is a component too!),
all sibling child controls share the same scope, so you can refer to
controls by their id. If the controls(components) have public
properties or methods, you can reference those members directly through
the id:
<mx:TextInput id="textinput1" text="test value" .../>
<mx:Text id="text1" ... text="{textinput1.text}" .../>
Ok, so far, its a "duh" right?
When you use custom components in a Flex app, at run time they make a
document object model hierarchy (DOM). Each subcomponent has its own
scope and code within that component can't *directly* reference the
member properties or methods of its sibling subcomponents.
So again, within a component, code can reference children directly, as
in the example above. But there are two other cases inherent in a
hierarchy. You might want to reference "up", to get to public members
of the parent, grandparent, etc, or 'down", to get to a "grandchild".
Accessing members in the parent:
On an ordinary component DOM, you can reference the parent component
using the .parent property. Say that a control with id="textinput1"
exists in the parent of the current component. then you could do:
<mx:Text id="text1" ... text="{parent.textinput1.text}"
.../>
Accessing members in the main application:
Components can be nested, sometimes very deeply. If the reference you
want is all the way at the top-level, main application (the one with the
<mx:Application> tag), you could do
{parent.parent.parent.textinput1.text}, but you would have to count the
component levels just right. Instead, you can use
Application.application to get to that scope:
<mx:Text id="text1" ...
text="{Application.application.textinput1.text}" .../>
You can shoretn this style of reference by importing
mx.core.Application, and assigning Application.application to a
variable, like _app, the doing (_app.textinput1.text)
Accessing components of a child component ("grandchildren"):
Say that in this case, a child component has the TextInput control you
want to reference. First, make sure the child component has an id:
<myComp:MyCustomComp id="mycc1" .../>
Then, in the same scope (the same component/file that contains "mycc1"
above) you can say:
<mx:Text id="text1" ... text="{mycc1.textinput1.text}" .../>
Accessing a nested component:
As mentioned above you can go "up" the hierarchy using
"parent.parent...". You can also go "down" the hirearchy using id
references:
<mx:Text id="text1" ...
text="{mycc1.mycc11.mycc.12.textinput1.text}" .../>
Additional notes:
If you are using SWFLoader to load an entire Application, you can
reference the immediate parent application using "parentDocument". You
can also use Application.application to reach the main app, as shown
above.
Accessing members of an application loaded by SWFLoader is a bit more
complicated. See the example here:
http://www.cflex.net/showFileDetails.cfm?ObjectID=690
________________________________
From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of Luke Vanderfluit
Sent: Tuesday, April 22, 2008 7:08 PM
To: [email protected]
Subject: [flexcoders] passing parameters to components
Hi.
I have a flex application that gets called from an html link and is
passed a
parameter. The param is personid.
I retrieve the parameter in the flex application (BrowserManager).
So I have access to it in the main application file.
I have a number of components within the main application, that do
server
requests. In some of those requests I need to pass the personid (that I
have
retrieved from the browser url).
My question is:
What is the accepted method of passing variables (params) between
components,
specifically, in this case, from parent to child component?
Thanks for your responses.
Kind regards.
Luke.
--
Luke Vanderfluit
Analyst / Web Programmer
e3Learning.com.au
08 8221 6422