通过代理传参数
package com.xlands.utils {
import flash.display.InteractiveObject;
import flash.utils.Dictionary;
public class Delegate {
/**
*用来存放createListener来创建的侦听器
*/
private static var funDictionary:Dictionary = new Dictionary;
/**
* 给方法增加参数
*/
public static function create(method:Function, ... additionalArgs):Function {
return createWithArgs(method, additionalArgs);
}
/**
* @desc 给方法增加参数 方法(2)
* @detail 下面的静态方法,主要是针对给事件侦听器传入参数,在需要移除时间侦听器时能找到它的引用
*
* @usage
* xxx.addEventListener(Event.xxx,Delegate.createListener(funNeedAddParam,xxx,1);
*
* 清除方法:(两步)
* xxx.removeEventListener(Event.xxx,Delegate.getListener(funNeedAddParam,xxx);
* Delegate.delFunction(funNeedAddParam,xxx);<------这步不要忘记...否则会令本类里面的funDictionary变臃肿
*
* by haosheng.lin
* @param method 要传参的函数引用
* @param additionalArgs 传到函数的参数
* @return 传参后的新函数引用
*
*/
public static function createListener(method:Function, $listenerCurrentTarget:InteractiveObject, ... additionalArgs):Function {
return createWithArgs(method, additionalArgs, true, $listenerCurrentTarget);
}
private static function createWithArgs(func:Function, args:*, needRemove:Boolean = false, $listenerCurrentTarget:InteractiveObject = null):Function {
var f:Function = function():* {
var func0:Function = arguments.callee.func;
var parameters:Array = arguments.concat(args);
return func0.apply(null, parameters);
};
f["func"] = func;
if (needRemove) {
var funDic:Dictionary = null;
if ($listenerCurrentTarget in funDictionary) {
funDic = funDictionary[$listenerCurrentTarget] as Dictionary;
} else {
funDic = new Dictionary();
funDictionary[$listenerCurrentTarget] = funDic;
}
funDic[func] = f;
}
return f;
}
public static function getListener(fun:Function, $listenerCurrentTarget:InteractiveObject):Function {
var listener:Function = null;
if ($listenerCurrentTarget in funDictionary) {
var funDic:Dictionary = funDictionary[$listenerCurrentTarget] as Dictionary;
if (fun in funDic) {
listener = funDic[fun] as Function;
} else {
//throw new Error("请求的函数不存在,可能不是用createListener()方法来创建,又或者已经使用delFun()来删除了")
listener = null;
}
} else {
//throw new Error("请求的函数不是用createListener()方法来创建,又或者已经使用delFun()来删除了")
listener = null;
}
return listener;
}
public static function delListener($fun:Function, $listenerCurrentTarget:InteractiveObject):void {
if ($listenerCurrentTarget in funDictionary) {
var funDic:Dictionary = null;
funDic = funDictionary[$listenerCurrentTarget] as Dictionary;
delete funDic[$fun];
if (DictionaryUtil.isLengthZero(funDic) == true) {
delete funDictionary[$listenerCurrentTarget]
}
}
}
}
}
使用方法
var action:XlandsHttpAction = new XlandsHttpAction();
action.addEventListener(HttpEvent.ON_HTTP_SUCCESS, Delegate.create(onRegisterSuccess, b));
action.actByMain();
private function onRegisterSuccess(b:Boolean):void{
this.registered = b;
}