0

最近、埋め込みボタンを使用する代わりに、外部コールバックで動作するように作成した小さなフラッシュアプ​​リを変更するように求められました。

私はプロセスを自動化しようとし、この機能を思いついた:

    /**
     * Add an External callback for all PUBLIC methods that listen to 'listenerType' in 'listenersHolder'.
     * @param   listenersHolder - the class that holds the listeners we want to expose.
     * @param   listenerType    - a String with the name of the event type we want to replace with the external callback.
     */
    public static function addCallbacksForListeners(listenersHolder:*, listenerType:String):void
    {
        // get the holder description
        var description:XML = describeType(listenersHolder);
        // go over the methods
        for each(var methodXML:XML in description..method)
        {
            // go over the methods parameters
            for each(var parameterXML:XML in methodXML..parameter)
            {
                // look for the requested listener type
                var parameterType:String = parameterXML.@type;
                if (parameterType.indexOf(listenerType) > -1)
                {
                    var methodName:String =  methodXML.@name;
                    trace("Found: " + methodName);
                    // get the actual method
                    var method:Function = listenersHolder[methodName];
                    // add the callback
                    try 
                    {
                        ExternalInterface.addCallback(methodName, method);
                        trace("A new callback was added for " + methodName);
                    } 
                    catch (err:Error)
                    {
                        trace("Error adding callback for " + methodName);
                        trace(err.message);
                    }
                }
            }
        }

この関数を使用する前に、リスナーの関数をPublicに変更し、nullのデフォルトパラメータを追加し、もちろんビジュアルを削除/非表示にする必要がありました。

たとえば、from:

プライベート関数onB1Click(e:MouseEvent):void

に :

パブリック関数onB1Click(e:MouseEvent = null):void

この行をinit/onAddedToStage関数に追加します。

addCallbacksForListeners(this、 "MouseEvent");

ボタンをステージから削除するか、ボタンを追加する行にコメントを付けます。

私の質問は:それを行うためのより良い/より効率的な方法を見つけることができますか?フィードバックを歓迎します。

4

1 に答える 1

3

たぶん、異なるfunctionNameparamを持つ単一のメソッドを呼び出すようにjavascriptを作成する必要があります。次に、コールバックを1つ追加するだけで、これらすべての関数を公開する必要はありません。

ExternalInterface.addCallback('callback', onCallback);

public function onCallback(res:Object)
{
    var functionName:String = res.functionName;
    this[functionName]();
}
于 2012-12-13T00:30:34.233 に答える