0

最近有人要求我更改我制作的一个小型 Flash 应用程序,以使用外部回调而不是使用嵌入式按钮。

我试图自动化这个过程并想出了这个功能:

    /**
     * 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);
                    }
                }
            }
        }

在使用此功能之前,我必须将侦听器的功能更改为公共,添加 null 默认参数,当然还有删除/隐藏视觉效果。

例如,来自:

私有函数 onB1Click(e:MouseEvent):void

至 :

公共函数 onB1Click(e:MouseEvent = null):void

将此行添加到 init/onAddedToStage 函数:

addCallbacksForListeners(this, "MouseEvent");

并从舞台上删除按钮或只是评论添加它的行。

我的问题是:你能找到更好/更有效的方法吗?欢迎任何反馈..

4

1 回答 1

3

也许你应该让 javascript 调用具有不同 functionName 参数的单个方法。然后你只需要添加一个回调,你不需要公开所有这些函数。

ExternalInterface.addCallback('callback', onCallback);

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