I would separate the classname out into another argument in your XML, so in
your example that's not working, you'd have:

 

<menuitem id="OpenAlertsWindowMenuOption" label="Open Alerts Window"
callbackClass="ProjectProperties" callback="setValue"
arguments="ShowAlertsWindow, true" />

 

Then you'd have to dynamically instantiate that class and call the assigned
method.  I have a couple tutorials on my blog about doing this:

 

http://jake.cfwebtools.com/2009/04/08/dynamically-instantiate-a-class/ 

http://jake.cfwebtools.com/2009/05/15/flex-dynamic-casting-of-data/ 

 

The 2nd one deals with data casting which might not be as relevant but I
still do the class stuff dynamically.  Here's an example of what this might
look like for you:

 

var className:Class = Class( getDefinitionByName( getQualifiedClassName(
"ProjectProperties" ) ) );

var function:Function = className["setValue"];

function.call(className[or null], parmaters.);

 

FYI, this code is completely untested, just trying to give you an idea.

 

Jake Churchill

CF Webtools

11204 Davenport, Ste. 100

Omaha, NE  68154

http://www.cfwebtools.com

402-408-3733 x103

 

From: flexcoders@yahoogroups.com [mailto:flexcod...@yahoogroups.com] On
Behalf Of edlueze
Sent: Tuesday, May 19, 2009 6:00 AM
To: flexcoders@yahoogroups.com
Subject: [flexcoders] Call a Flex Function by Name

 






I'm using a Menu control. Normally I'd catch the Menu's control event and
then act on whatever selection the user made with something like a switch
block.

But I wanted to see if I could be more clever and embed the function name
and parameters in the XML Menu data provider itself, like this:

<mx:XML id="xmlFormMenuOptions" >
<Menu id="MenuOptions">
<menuitem id="AddNewChartMenuOption" label="Add Chart..."
callback="AddNewChartButton_click" arguments="" />
<menuitem id="RenameChartMenuOption" label="Rename Chart..."
callback="PopUpTextBox" arguments="RenameChart, RenameChartButtonTextBox,
{nameChartSelected}" enabled="{selectedChartingPanelTableCell}" />
<menuitem id="DeleteChartMenuOption" label="Delete Chart"
callback="PopUpCheckBox" arguments="DeleteChart, DeleteChartButtonCheckBox"
enabled="{selectedChartingPanelTableCell}" />
<menuitem id="RaiseChartOrderMenuOption" label="Raise Chart Order"
callback="RaiseChartOrderButton_click" arguments=""
enabled="{RaiseChartOrderButton.enabled}" />
<menuitem id="LowerChartOrderMenuOption" label="Lower Chart Order"
callback="LowerChartOrderButton_click" arguments=""
enabled="{LowerChartOrderButton.enabled}" />
<menuitem id="OpenAlertsWindowMenuOption" label="Open Alerts Window"
callback="ProjectProperties.setValue" arguments="ShowAlertsWindow, true" />
<menuitem id="ChartingPanelWhatAmIMenuOption" label="What am I?"
callback="PopUpMessage" arguments="ChartingPanelWhatAmIMenuOption, null " />
<menuitem id="HelpMenuOption" label="Help" callback="" />
</Menu>
</mx:XML>

If you look at each <menuitem/> you'll see a 'callback' attribute and an
'arguments' attribute. The arguments are comma-delineated that I need to
parse into an Array and scrub: for example, by converting string references
into real ones like this:

if( this.hasOwnProperty(arg) )
arrayArguments[i] = this[arg];

I then have been successful in using the callLater function like this:

callLater(this[callback], arrayArguments);

So far so good - it works great!

But I've hit a tiny snag. If the function is in a foreign class then
everything falls apart. For example, this won't work:

callback = "ProjectProperties.setValue"
arguments = "ShowAlertsWindow, true"

Because there is no such thing as this[ProjectProperties.setValue] the
callLater function can't handle it. I can easily build a little stub but I'm
hoping to keep things clean and elegant.

I've been searching for a way to call-by-name in Flex but haven't found one
(except for callLater). Is there a way I can do this?



Reply via email to