Search code examples
flashactionscript-3objectjsfl

how to pass an object from a windowSWF to JSFL?


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){}

Solution

  • 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.