Ромастый
22.10.2006, 04:11
Как-то, еще давным-давно в эпоху mx2004, встала задача перехватывать вызов нужных методов каких-либо объектов, без того, чтобы прописывать в них бродкасты.
Набросал такой вот класс:
import mx.events.EventDispatcher;
import mx.utils.Delegate;
//
class EventInterceptor {
var _targ = new Object();
var _func:Function;
var _func_name:String;
private var dispatchEvent:Function;
public var addEventListener, removeEventListener:Function;
var onEvent:Function;
//
function EventInterceptor() {
EventDispatcher.initialize(this);
this.addEventListener("onEvent", this);
}
//
public function intercept(obj:Object, func:String):Void {
if (_targ && _func) {
dismiss();
}
_targ = obj;
_func_name = func;
_func = obj[func];
_targ[func] = Delegate.create(this, executeEvent);
}
//
public function dismiss():Void {
_targ[_func_name] = _func;
}
//
private function executeEvent():Void {
_func.apply(_targ, arguments);
dispatchEvent({type:"onEvent", target:_targ, event:_func_name});
}
}
Жуткий гибрид Делегата и ЕвентДиспетчера. Хых.. Написал и забыл.
Не так давно была тема по динамическому добавлению/удалению действий, к примеру, в onEnterFrame без полного переписывания.
Решил поэкспериментировать.
К примеру есть на сцене 2 клипа: mc1 и mc2
mc1.move = function() {
this._x += 20;
};
mc1.onEnterFrame = function() {
this.move();
};
EI1 = new EventInterceptor();
EI1.intercept(mc1, "move");
EI1.onEvent = function(evt_obj) {
_root.mc2._x += 2;
trace("1: "+this+" "+evt_obj.target+" "+evt_obj.event);
};
//
EI2 = new EventInterceptor();
EI2.intercept(mc1, "move");
EI2.onEvent = function(evt_obj) {
_root.mc1._y += 2;
trace("2: "+this+" "+evt_obj.target+" "+evt_obj.event);
};
//
EI3 = new EventInterceptor();
EI3.intercept(mc1, "move");
EI3.onEvent = function(evt_obj) {
_root.mc2._y += 2;
trace("3: "+this+" "+evt_obj.target+" "+evt_obj.event);
};
Плюсы такого подхода:
Экземпляры интерсептора перехватывают вызов метода move, и выполняют свои действия. Все ок.
Но. Минусы:
1. Все перехваты осуществляются последовательно, а не независимо. То есть следующий интерсептор перехватывает не mc1.move, как казалось бы, а делегат предыдущего.
2.Вытекает из первой. Если мы удаляем предыдущий перехватчик, то и следующий за ним тоже перестает работать.
Вопрос: может кто делал что-то подобное и как-то еще решал такую задачу?
Набросал такой вот класс:
import mx.events.EventDispatcher;
import mx.utils.Delegate;
//
class EventInterceptor {
var _targ = new Object();
var _func:Function;
var _func_name:String;
private var dispatchEvent:Function;
public var addEventListener, removeEventListener:Function;
var onEvent:Function;
//
function EventInterceptor() {
EventDispatcher.initialize(this);
this.addEventListener("onEvent", this);
}
//
public function intercept(obj:Object, func:String):Void {
if (_targ && _func) {
dismiss();
}
_targ = obj;
_func_name = func;
_func = obj[func];
_targ[func] = Delegate.create(this, executeEvent);
}
//
public function dismiss():Void {
_targ[_func_name] = _func;
}
//
private function executeEvent():Void {
_func.apply(_targ, arguments);
dispatchEvent({type:"onEvent", target:_targ, event:_func_name});
}
}
Жуткий гибрид Делегата и ЕвентДиспетчера. Хых.. Написал и забыл.
Не так давно была тема по динамическому добавлению/удалению действий, к примеру, в onEnterFrame без полного переписывания.
Решил поэкспериментировать.
К примеру есть на сцене 2 клипа: mc1 и mc2
mc1.move = function() {
this._x += 20;
};
mc1.onEnterFrame = function() {
this.move();
};
EI1 = new EventInterceptor();
EI1.intercept(mc1, "move");
EI1.onEvent = function(evt_obj) {
_root.mc2._x += 2;
trace("1: "+this+" "+evt_obj.target+" "+evt_obj.event);
};
//
EI2 = new EventInterceptor();
EI2.intercept(mc1, "move");
EI2.onEvent = function(evt_obj) {
_root.mc1._y += 2;
trace("2: "+this+" "+evt_obj.target+" "+evt_obj.event);
};
//
EI3 = new EventInterceptor();
EI3.intercept(mc1, "move");
EI3.onEvent = function(evt_obj) {
_root.mc2._y += 2;
trace("3: "+this+" "+evt_obj.target+" "+evt_obj.event);
};
Плюсы такого подхода:
Экземпляры интерсептора перехватывают вызов метода move, и выполняют свои действия. Все ок.
Но. Минусы:
1. Все перехваты осуществляются последовательно, а не независимо. То есть следующий интерсептор перехватывает не mc1.move, как казалось бы, а делегат предыдущего.
2.Вытекает из первой. Если мы удаляем предыдущий перехватчик, то и следующий за ним тоже перестает работать.
Вопрос: может кто делал что-то подобное и как-то еще решал такую задачу?