|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
совместное использование Delegate и EventDispatcher
Все знают, что 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,784
|
Что-то мне подсказывает, что при таком подходе ты можешь удалить не тот обработчик…
|
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Цитата:
А смысл вешать два и более делегатов на одно событие?
__________________
...Тебе страшно? Мне - нет. Последний раз редактировалось Ромастый; 20.12.2006 в 18:37. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
Ну случаев, когда обработчиков больше одного может быть много.
Три варианта: 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,784
|
Кстати, Нокс предлагал решение удаления типа arguments.caller.removeEventListener ('someEvent',arguments.callee)
Последний раз редактировалось etc; 07.02.2007 в 17:46. |
|
|||||
4AM Games
|
А чем не подходит вариант которым польюзуются тысячи программистов на C#
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^ |
Часовой пояс GMT +4, время: 10:37. |
|
« Предыдущая тема | Следующая тема » |
|
|