имя функции в xml и вызов этой функции - PullRequest
1 голос
/ 01 июля 2011

У меня есть функции и XML-файл, в котором я храню имя этих функций и компонентов ... например.

<commands>
  <command>
    <flexObject>myObject1</flexObject>
    <flexFunction>myFunction1</flexFunction>
  </command>

  <command>
    <flexObject>myObject2</flexObject>
    <flexFunction>myFunction2</flexFunction>
  </command>
</commands>

Я хочу создать массив функций и затем вызывать их ... как

arr:Array = new Array(); 
arr.push(myObject1.myFunction1);
arr.push(myObject2.myFunction1);

arr[0]();

вызов функции myObject1.myFunction1

myObjects и myFunctions являются классическим компонентом, и их функции

, когда я вызываю setCommandsService.send <s:HTTPService id="setCommandsService" url="commands.xml" result="setCommandsService_resultHandler(event)"/> в обработчике, это имя этой функции как String ия не знаю, как я могу добавить в массив как функцию ..

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Хорошо, вам нужно убедиться, что эти объекты и функции есть, но это должно быть возможно с использованием динамической природы actionscript:

var functions:Array = [];
for(var i:uint = 0, len:uint = xml.command.length(); i<len; i++)
{
   if(this[xml.command[i].flexObject] && this[xml.command[i].flexObject][xml.command[i].flexFunction])
   {
      functions.push(this[xml.command[i].flexObject][xml.command[i].flexFunction]);
   }
}

Это заполнит ваш массив прямыми ссылками на функциюотсюда нужно просто набрать functions[i](), чтобы позвонить им.С учетом сказанного я не говорю, что согласен с тем, что XML знает о внутренней работе вашего приложения.Этот xml может вызывать что-либо извне, что является определенной проблемой безопасности.Во всяком случае, попытайтесь абстрагировать его до идентификатора 'action', который вы анализируете в flex, а затем flex знает, что делать.

1 голос
/ 01 июля 2011

Попробуйте:

this[arr[0]]();

или

var f:Function = Object[arr[0]] as Function; 
f.call();
0 голосов
/ 01 июля 2011

Вам может понадобиться использовать getDefinitionByName

import flash.utils.getDefinitionByName;

var function:Function = getDefinitionByName('namespace.myFunction1') as Function;

Это работает только для функций уровня пространства имен, но не для статических методов класса

...