используя аргумент Array в jsfl с swfPanel.call - PullRequest
0 голосов
/ 08 сентября 2011

Я пытаюсь создать swfPanel для Flash CS5.5, используя JSFL. Я создал свой интерфейс во флэш-памяти и пытаюсь связаться с командой JSFL. Итак, в моем .fla файле я использую ExternalInterface с callBack для вызова определенной функции в JSFL, а затем swfPanel.call () для возврата. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу передать Array в качестве аргумента для функции вызова (после имени функции AS3). Вот код:

В AS3:

function init():void{
    ExternalInterface.addCallback("callBackPanel", JsflCallback);
    MMExecute("fl.runScript( fl.configURI + \"AirMobileFramework/AirMobileFrameworkPanel.jsfl\", \"checkSettings\" );");
}

function JsflCallback(... args):void{
    jsTrace("callback");
}

function jsTrace(str:String):void{
    MMExecute("fl.trace(\"" + str + "\");");
}

В JSFL:

function checkSettings(){   
    var fileSettingsUrl = fl.configURI + "AirMobileFramework/settings.fwk";
    var exist = FLfile.exists(fileSettingsUrl);
    var result = new Array("settings", exist);

    if(!exist){
        FLfile.write(fileSettingsUrl, "");
    } else {
        result.push(FLfile.read(fileSettingsUrl));
    }

    callPanelBack(result);
}

function callPanelBack(result){
    fl.trace("result: " + result.length + " > " + typeof result + " >> " + result[0]);
    var panel;
    if(fl.swfPanels.length > 0){ 
        for(x = 0; x < fl.swfPanels.length; x++){
            if(fl.swfPanels[x].name == "AirMobileFramework"){ 
                panel = fl.swfPanels[x];
                panel.call("callBackPanel", result); 
                break; 
            } 
        }
    } else {
        fl.trace("No existing panel");
    }
}

При вызове panel.call ("callBackPanel", result [0], result [1]); проблем нет, мой обратный вызов хорошо вызывается, но при использовании panel.call ("callBackPanel", результат); У меня ошибка: La ou les erreurs JavaScript suivantes se sont productions lors de l'exécution AirMobileFramework: La ou les erreur (s) Продукты JavaScript suivantes se sont:

Есть идеи ??

Ответы [ 2 ]

0 голосов
/ 24 сентября 2011

Это то, что вам нужно для передачи массивов назад и вперед от JSFL: http://exanimo.com/actionscript/jsflinterface/

И на это стоит обратить внимание, когда он выйдет примерно через неделю: http://www.xjsfl.com

0 голосов
/ 18 сентября 2011

Я думаю, это потому, что JSFL не может анализировать массив.В приведенном вами примере с результатом [0], результатом [1] у вас есть отдельные значения (вероятно, стриги или числа), и это не должно вызывать проблем.

Я бы сделал следующее:

panel.call("callBackPanel", result.join("@*$");

, а в функции as3 просто arg.split ("@ * $")

, если на вашем входе может быть строка "@ * $", тогда вы можете просто позвонитьSWF для каждого элемента в результате, и когда вы закончите с циклом там, скажите SWF, чтобы собрать вещи - как это:

function callPanelBack(result){
    fl.trace("result: " + result.length + " > " + typeof result + " >> " + result[0]);
    var panel;
    if(fl.swfPanels.length > 0){ 
        for(x = 0; x < fl.swfPanels.length; x++){
            if(fl.swfPanels[x].name == "AirMobileFramework"){ 
                panel = fl.swfPanels[x];
                panel.call("callBackPanelStart"); 
                for(var i=0; i < result.length; i++){
                    panel.call("callBackPanelArgument", result[i])
                }
                panel.call("callBackPanelEnd"); 
                break; 
            } 
        }
    } else {
        fl.trace("No existing panel");
    }
}

, а затем в AS3:

function callBackPanelStart():void
{
    jsflArray = [];
}

function callBackPanelArgument(argument:*):void
{
    jsflArray.push(argument);
}

function callBackPanelEnd():void
{
    // execute whatever you must on the result
}
...