![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Все знают, что Delegate.create каждый раз возвращает новый объект. И подписавшись раз на событие таким макаром
Отписаться от него потом весьма проблематично. Можно отписаться от него в самом методе в момент вызова через 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
__________________
...Тебе страшно? Мне - нет. Последний раз редактировалось Ромастый; 20.12.2006 в 18:12. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Что-то мне подсказывает, что при таком подходе ты можешь удалить не тот обработчик…
|
|
|||||
|
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Цитата:
А смысл вешать два и более делегатов на одно событие?
__________________
...Тебе страшно? Мне - нет. Последний раз редактировалось Ромастый; 20.12.2006 в 18:37. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Ну случаев, когда обработчиков больше одного может быть много.
Три варианта: 1) Написать свой EventDispatcher (или найти более правильный, который работает по типу EventDispatcher в AS3, там не требуется делегата) 2) Написать отдельный класс, который будет хранить ссылку на делегированную функцию и по вызову убивать подписку. 3) Хранить ссылку внутри класса (нерационально) |
|
|||||
|
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Цитата:
Во всех прочих случаях удаляется нужный обработчик. Цитата:
)
__________________
...Тебе страшно? Мне - нет. |
|
|||||
|
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
В порядке теста навешал до двух десятков различных - все работает, удаляется только нужный.
ПРоблемы возникают только при многократном: myObject.addEventListener("onEvent", Delegate.create(MyOtherObject, method));
myObject.addEventListener("onEvent", Delegate.create(MyOtherObject, method));
Лечится исключительно опять же многократным вызовом: DelegateRemover.removeDelegate(myObject, "onEvent", MyOtherObject, method); DelegateRemover.removeDelegate(myObject, "onEvent", MyOtherObject, method); ... Так же вроде все нормально работает с макромедийными компонентами ![]()
__________________
...Тебе страшно? Мне - нет. |
|
|||||
|
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Гыгы.
Удаляются все подписчики-клоны, созданные Delegate'ом, ежели цикл for заменить на for in и убрать нафих выход из метода.
__________________
...Тебе страшно? Мне - нет. |
|
|||||
|
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Стормозил
![]()
__________________
...Тебе страшно? Мне - нет. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Кстати, Нокс предлагал решение удаления типа arguments.caller.removeEventListener ('someEvent',arguments.callee)
Последний раз редактировалось etc; 07.02.2007 в 17:46. |
|
|||||
|
4AM Games
|
А чем не подходит вариант которым польюзуются тысячи программистов на C#
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^ |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:23. |
|
|
« Предыдущая тема | Следующая тема » |
|
|