Как передать объект из WindowSWF в JSFL?
-
22-07-2019 - |
Вопрос
Я работаю с fla, файлом as (класс документа) и файлом jsfl. SWF генерируется в папке WindowSWF (например, $ flash / WindowSWF)
У меня есть простой windowSWF, и я использую MMExecute и fl.runScript для передачи переменных из as3 в jsfl. Я не предполагал, что у меня будут проблемы, если я буду использовать объекты.
В моем windowSWF у меня есть DataGrid с именем settingsGrid со следующими столбцами: [& Quot; Префикс & Quot;, & Quot; суффикс & Quot;, & Quot; тип & Quot;] и я пытаюсь передать settingsGrid.dataProvider.toArray () в сценарий jsfl.
Проблема в том, что с другой стороны он не определен. Любые намеки на то, как я могу обойти это? Р>
Краткая версия: как передать массив объектов, таких как {префикс: " значение " суффикс: " значение " тип: " значение "}, из Actionscript в jsfl. Передача отдельных объектов работает, я получаю сообщение об ошибке при передаче массива:
"Syntax Error: missing ] after element list"
Мой вызов функции выглядит следующим образом:
MMExecute('fl.runScript(fl.configURI + "Commands/LazyGen.jsfl","generate","_",'+ settingsGrid.dataProvider.toArray() +');');
и подпись для метода в файле jsfl выглядит следующим образом:
function generate(prefixArg,settingsArg){}
Решение
Я передаю объекты из таблицы данных в JSFL. Объекты имеют следующие свойства: ключ , замена и тип . Вот функция, которую я использовал для создания строки, которую я мог передать в JSFL из 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;
}
Я заметил, что настройки в SWF не были каким-то волшебным образом сохранены, поэтому я использовал локальный SharedObject для сохранения настроек из dataProvider. Думаю, я мог бы просто написать файл с использованием FLfile, но я не хотел продолжать преобразовывать массивы в строки и обратно. Я записываю массив dataProvider (dataProvider.toArray ()) в ByteArray, который я просто читаю и вставляю в конструктор нового DataProvider, когда мне это нужно.
Другие советы
Просто определите значение переменных внутри вашего windowsSWF и передайте переменные в JSFL с помощью команды MMExecute. Р>
Следующая команда устанавливает черный цвет заливки на панели инструментов. Так, например, значение цвета может быть получено из компонента выбора цвета и затем передано в jsfl. Все, что я делаю, это объединяю переменную из сценария действия в строку, которая отправляется через MMExecute.
var myColor:String = "#000000";
MMExecute("var fill = fl.getDocumentDOM().getCustomFill(\"toolbar\");fill.style= \"solid\";fill.color = \'"+myColor+"\';fl.getDocumentDOM().setCustomFill( fill );");