Ромастый
20.12.2006, 18:02
Все знают, что Delegate.create каждый раз возвращает новый объект. И подписавшись раз на событие таким макаром
myObject.addEventListener("myEvent", Delegate.create(myOtherObject, myOtherObjectMethod));
Отписаться от него потом весьма проблематично.
Можно отписаться от него в самом методе в момент вызова через arguments.caller (с) NoxNoctis
А если надо извне, в любой другой момент?
Вот, тут подумалось, что можно просто обойти цепочку:
class DelegateRemover {
public static function removeDelegate(dispatcher, event, obj, func) {
var queue = dispatcher["__q_"+event];
var l:Number = queue.length;
var i:Number;
for (i=0; i<l; i++) {
var o = queue[i];
if (typeof(o) == "function" && o.target == obj && o.func == func) {
queue.splice(i, 1);
return;
}
}
}
}
Скажем есть класс
import mx.utils.Delegate;
//
class MyClass {
var id;
function MyClass(ID) {
id = ID;
}
function addEvent(event, obj) {
obj.addEventListener(event, Delegate.create(this, report));
}
function report(obj) {
trace(id+" "+obj.type);
}
}
В первом кадре пишем:
import mx.events.EventDispatcher;
var mo = new Object();
EventDispatcher.initialize(mo); // Создали вещатель
myC1 = new MyClass("myC1");
myC1.addEvent("onEvent", mo); // Создали экземпляр myClass и подписали его на onEvent
myC2 = new MyClass("myC2");
myC2.addEvent("onEvent", mo); // Создали контрольный экземпляр
mo.dispatchEvent({type:"onEvent"}); // trace myC2 onEvent myC1 onEvent
trace("_____________________________________________");
DelegateRemover.removeDelegate(mo, "onEvent", myC1, myC1.report); // удалили
mo.dispatchEvent({type:"onEvent"}); // trace myC2 onEvent
myObject.addEventListener("myEvent", Delegate.create(myOtherObject, myOtherObjectMethod));
Отписаться от него потом весьма проблематично.
Можно отписаться от него в самом методе в момент вызова через arguments.caller (с) NoxNoctis
А если надо извне, в любой другой момент?
Вот, тут подумалось, что можно просто обойти цепочку:
class DelegateRemover {
public static function removeDelegate(dispatcher, event, obj, func) {
var queue = dispatcher["__q_"+event];
var l:Number = queue.length;
var i:Number;
for (i=0; i<l; i++) {
var o = queue[i];
if (typeof(o) == "function" && o.target == obj && o.func == func) {
queue.splice(i, 1);
return;
}
}
}
}
Скажем есть класс
import mx.utils.Delegate;
//
class MyClass {
var id;
function MyClass(ID) {
id = ID;
}
function addEvent(event, obj) {
obj.addEventListener(event, Delegate.create(this, report));
}
function report(obj) {
trace(id+" "+obj.type);
}
}
В первом кадре пишем:
import mx.events.EventDispatcher;
var mo = new Object();
EventDispatcher.initialize(mo); // Создали вещатель
myC1 = new MyClass("myC1");
myC1.addEvent("onEvent", mo); // Создали экземпляр myClass и подписали его на onEvent
myC2 = new MyClass("myC2");
myC2.addEvent("onEvent", mo); // Создали контрольный экземпляр
mo.dispatchEvent({type:"onEvent"}); // trace myC2 onEvent myC1 onEvent
trace("_____________________________________________");
DelegateRemover.removeDelegate(mo, "onEvent", myC1, myC1.report); // удалили
mo.dispatchEvent({type:"onEvent"}); // trace myC2 onEvent