如何将一个对象从windowSWF传递给JSFL?

时间:2009-06-24 15:58:39

标签: flash actionscript-3 object jsfl

我正在处理fla,文件类(文档类)和jsfl文件。 swf在WindowSWF文件夹中生成(例如$ flash / WindowSWF)

我有一个简单的windowSWF,我正在使用MMExecute和fl.runScript将变量从as3传递给jsfl。我不认为如果我会使用物体,我会遇到麻烦。

在我的windowSWF中,我有一个名为 settingsGrid 的DataGrid,其中包含以下列: [ “前缀”, “后缀”, “类型”] 我想把 settingsGrid.dataProvider.toArray()传递给jsfl脚本。

问题是它在另一方面是未定义的。关于如何解决这个问题的任何提示?

简短版本:如何从actionscript到jsfl传递像{prefix:“value”,suffix:“value”,type:“value”}这样的对象数组。传递单个对象有效,当我传递数组时出错:

"Syntax Error: missing ] after element list"

我的函数调用如下所示:

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

并且jsfl文件中方法的签名如下所示:

function generate(prefixArg,settingsArg){}

2 个答案:

答案 0 :(得分:2)

我将对象从数据网格传递给JSFL。对象具有以下属性: 密钥替换类型。这是我用来构造一个我可以通过actionscript传递给JSFL的字符串的函数:

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;
        }

我注意到SWF中的设置没有以某种方式神奇地保存,因此我使用本地SharedObject来存储dataProvider中的设置。我想我可以用FLfile编写一个文件,但我不想继续将数组转换为字符串并返回。我正在将一个dataProvider的数组(dataProvider.toArray())写入ByteArray,我刚刚读回来并在需要时将其推入新DataProvider的构造函数中。

答案 1 :(得分:1)

只需在windowsSWF中计算变量值,然后通过MMExecute命令将变量传递给JSFL。

以下命令将工具栏中的填充颜色设置为黑色。因此,例如,颜色的值可以从颜色选择器组件中获取,然后传递给jsfl。我所做的只是将动作脚本中的变量连接到通过MMExecute发送的字符串。

var myColor:String = "#000000";
MMExecute("var fill = fl.getDocumentDOM().getCustomFill(\"toolbar\");fill.style= \"solid\";fill.color = \'"+myColor+"\';fl.getDocumentDOM().setCustomFill( fill );");