2011-07-01 11 views
1

私はこの関数とコンポーネントの名前を格納する関数とxmlファイルを持っています。xmlに関数名があり、この関数を呼び出す

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

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

iは関数の配列を作りたいし、その後

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

arr[0](); 

コールmyObject1.myFunction1機能

myObjectsとmyFunctionsがあり、古典的なコンポーネントとその機能としてthem..like呼び出す

私がsetCommandsService.sendを呼び出すとき<s:HTTPService id="setCommandsService" url="commands.xml" result="setCommandsService_resultHandler(event)"/> ハンドラの はStringとしてこの関数の名前であり、私はhoを知らないW iは..関数としてアレイに追加することができ

答えて

2

さて、あなたはそれらのオブジェクトや関数があることを確認する必要がありますが、アクションスクリプトの動的な性質を利用して可能にする必要があります:

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が外部から何かを呼び出す可能性がありますが、それは確実なセキュリティ上の問題です。何かあれば、それを「アクション」IDに抽象化してください。あなたはそれをフレックスで解析し、次にフレックスは何をすべきかを知っています。

1

試してみてください。

this[arr[0]](); 

または

var f:Function = Object[arr[0]] as Function; 
f.call(); 
0
あなたは

import flash.utils.getDefinitionByName; 

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

これだけ作品ネームスペースで上getDefinitionByNameを使用する必要があり

静的なクラスメソッドではないがレベルの関数

関連する問題