совместное использование Delegate и EventDispatcher
Все знают, что Delegate.create каждый раз возвращает новый объект. И подписавшись раз на событие таким макаром
Код:
myObject.addEventListener("myEvent", Delegate.create(myOtherObject, myOtherObjectMethod)); Можно отписаться от него в самом методе в момент вызова через arguments.caller (с) NoxNoctis А если надо извне, в любой другой момент? Вот, тут подумалось, что можно просто обойти цепочку: Код:
class DelegateRemover { Код:
import mx.utils.Delegate; Код:
import mx.events.EventDispatcher; |
Что-то мне подсказывает, что при таком подходе ты можешь удалить не тот обработчик…
|
Цитата:
А смысл вешать два и более делегатов на одно событие? |
Ну случаев, когда обработчиков больше одного может быть много.
Три варианта: 1) Написать свой EventDispatcher (или найти более правильный, который работает по типу EventDispatcher в AS3, там не требуется делегата) 2) Написать отдельный класс, который будет хранить ссылку на делегированную функцию и по вызову убивать подписку. 3) Хранить ссылку внутри класса (нерационально) |
Цитата:
Во всех прочих случаях удаляется нужный обработчик. Цитата:
|
В порядке теста навешал до двух десятков различных - все работает, удаляется только нужный.
ПРоблемы возникают только при многократном: Код:
myObject.addEventListener("onEvent", Delegate.create(MyOtherObject, method)); Лечится исключительно опять же многократным вызовом: Код:
DelegateRemover.removeDelegate(myObject, "onEvent", MyOtherObject, method); Так же вроде все нормально работает с макромедийными компонентами :away: |
Гыгы.
Удаляются все подписчики-клоны, созданные Delegate'ом, ежели цикл for заменить на for in и убрать нафих выход из метода. :rolleyes: Код:
class DelegateRemover { |
Стормозил :rolleyes:
|
Кстати, Нокс предлагал решение удаления типа arguments.caller.removeEventListener ('someEvent',arguments.callee)
|
А чем не подходит вариант которым польюзуются тысячи программистов на C#
Код:
|
Часовой пояс GMT +4, время: 02:30. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.