views:

454

answers:

2

I'm working with an fla, an as file(document class), and a jsfl file. the swf is generated in the WindowSWF folder (e.g. $flash/WindowSWF)

I have a simple windowSWF and I'm using MMExecute and fl.runScript to pass variables from as3 to jsfl. I didn't imagine I would run into trouble if I would use objects though.

In my windowSWF I have a DataGrid called settingsGrid with the following columns: ["prefix","suffix","type"] and I'm tring to pass settingsGrid.dataProvider.toArray() to the jsfl script.

The problem is it comes out as undefined on the other side. Any hints on how I can get around that ?

The short version: How can I pass an array of objects like {prefix:"value",suffix:"value",type:"value"} from actionscript to jsfl. Passing single objects works, I get an error when I pass an array:

"Syntax Error: missing ] after element list"

My function call looks like this:

MMExecute('fl.runScript(fl.configURI + "Commands/LazyGen.jsfl","generate","_",'+ settingsGrid.dataProvider.toArray() +');');

and the signature for the method in the jsfl file looks like this:

function generate(prefixArg,settingsArg){}
+1  A: 

I'm passing objects from a Data Grid to JSFL. The objects have the following properties: key, replacement and type. Here is the function I've used to construct a string I could pass in JSFL from actionscript:

private function dataProviderToString(dataProvider:DataProvider):String{
      var settingsString:String = '[';
      for(var i:int = 0 ; i < dataProvider.length ; i++){
       if(i < (dataProvider.length-1)) settingsString += '{key:"'+ dataProvider.getItemAt(i).key + '",replacement:"' + dataProvider.getItemAt(i).replacement + '",type:"'+ dataProvider.getItemAt(i).type + '"},';
       else settingsString += '{key:"'+ dataProvider.getItemAt(i).key + '",replacement:"' + dataProvider.getItemAt(i).replacement + '",type:"'+ dataProvider.getItemAt(i).type + '"}';
      }
      settingsString += ']';
      return settingsString;
     }

I noticed settings in the SWF weren't magically saved somehow, so I used local SharedObject to store the settings from the dataProvider. I guess I could have just wrote a file using FLfile, but I didn't want to keep converting arrays to strings and back. I'm writing a the dataProvider's array ( dataProvider.toArray() ) to a ByteArray that I just read back and shove in into the constructor of a new DataProvider when I need it.

George Profenza
+1  A: 

Just work out your variables value inside your windowsSWF and pass the variables into JSFL via the MMExecute command.

The following command sets the fill color in the toolbar to black. So for example the value of the color could be grabbed from a color picker component and then passed to jsfl. All I do is concatenate the variable from action script into the string that is sent via MMExecute.

var myColor:String = "#000000";
MMExecute("var fill = fl.getDocumentDOM().getCustomFill(\"toolbar\");fill.style= \"solid\";fill.color = \'"+myColor+"\';fl.getDocumentDOM().setCustomFill( fill );");
Ibis
George Profenza
Yeah I've always preferred to just do all my stuff inside windowSWFs, mostly cause it gives me full control over the UI. That's a pretty handy extension by the way. I'm having to convert my own app over to FLFile as well. I'm the developer of ToonTitan (http://flashfilmmaker.com/news/toon-titan-4.html)... it has this color management system in it which is all stored in a shared object... freaking nightmare LOL.
Ibis