![]() |
|
||||||||||
|
|||||
|
etc, поясни пожалуста.
Правильно ли я понял, что для дерева объектов входящих в модель вы реализовали собственный механизм баблинга?
__________________
Сам себе репортер |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
terbooter, да, правильно.
|
|
|||||
|
etc, всегда он был интересен, как вы его реализовали. Кроме как
мне ничего на ум не лезет.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
А что в этом плохого? Я также делал.
as2 вариант: public function dispatchEvent(event:Event):Void { event.target = this; event.currentTarget = this; var i:Number = 0; var l:Number = _eventListeners.length; for (i = 0; i < l; i++) { if (event.type != _eventListeners[i].e) continue; _eventListeners[i].f.apply(_eventListeners[i].o, [event.clone()]); } dispatchBubblesEvent(event); delete event; } // всплытие событий public function dispatchBubblesEvent(event:Event):Void { if (event.bubbles && this["eventParent"].dispatchEvent) { var bubblesEvent:Event = event.clone(); bubblesEvent.currentTarget = this["eventParent"]; this["eventParent"].dispatchEvent(bubblesEvent); } delete event; }
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 11.12.2010 в 22:34. |
|
|||||
|
Я не говорил что это плохо.
Но информация о фазе и таргет безнадёжно теряется в случае с редиспатчем при бабблинге. Как вариант - переопределять геттеры для них и писать обёртку, но в моём жалком умишке это дело не проецируется красиво. Think костыльно.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
всё определяется целями. костыльность - сугубо ирреалистичное понятие, я бы сказал близкое к гейзенбергову пространству. пока его не трогаешь - это не костыль. )))
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 12.12.2010 в 01:32. |
|
|||||
|
Как это получилось, что eventParent оказалось невозможным статически затипизировать?
Определяется в наследнике класса ? - но почему тогда просто не перегрузить Котяра, ещё интересно почему надо было самому в цикле листенеры обходить а не просто вызвать super.dispatchEvent() в перегруженном методе Просто сейчас пытаюсь свою (с немного другими целями) реализацию накатать - запнулся на том, как определить было ли вызвано stopPropagation() и ищу альтернативы. Проехали, "as2-вариант" не увидел ![]() Последний раз редактировалось expl; 12.12.2010 в 00:39. |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Насчёт ["eventParent"] - замануха вроде бы была, что я динамически назначал классы эвентДиспатчерами..
А чтоб FD не матерился - сделал в скобках. Ну или что-то такое - не помню. и это: тигра: таргет у меня остаётся ( там в сеттере есть проверка на существование - если он уже есть - то посылаем в Кубу), а фазу я просто не реализовывал вообще - я и в ас3 её ни разу не использовал.
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 12.12.2010 в 01:30. |
|
|||||
|
Ам. А если надо событие редиспатчить — именно редиспатчить с созданием клона с изменением таргета? Или тебе такая возможность не нужна совершенно?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Решил тоже реализовать что-то подобное. Мне нужно чтобы событие от детей всплывало до "рутовой" модели.
Таким образом модель лист может не иметь ссылку на родителя. Вот такая зарисовочка package ru.terbooter.farm.model { import flash.events.Event; import flash.events.EventDispatcher; import flash.utils.Dictionary; import ru.terbooter.farm.model.events.HelperEvent; /** * ... * @author terbooter.ru */ public class ModelBase extends EventDispatcher { private var dictionary:Dictionary; public function ModelBase() { } /** * От каждого ребенка событие будет всплывать * до рутовой модели * @param child */ protected function addChild(child:ModelBase):void { if (!this.dictionary) { this.dictionary = new Dictionary(true); } child.addEventListener(HelperEvent.LISTEN_TO, helperListener); //TODO this.dictionary[child] = { }; } protected function removeChild(child:ModelBase):void { //TODO } /** * Перед основным событием диспатчим вспомогательное, * которое расскажет паренту, какой тип события слушать, * чтобы передать его дальше по цепочке * @param event * @return */ override public function dispatchEvent(event:Event):Boolean { var helper:HelperEvent = new HelperEvent(HelperEvent.LISTEN_TO); helper.eventToListen = event; super.dispatchEvent(helper); return super.dispatchEvent(event); } private function helperListener(e:HelperEvent):void { var dispatcher:EventDispatcher = EventDispatcher(e.target); dispatcher.addEventListener(e.eventToListen.type, bubbleListener); } private function bubbleListener(e:Event):void { //TODO this.dictionary[e.target][e.type] = 1; this.dispatchEvent(e); } } }
__________________
Сам себе репортер |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:58. |
|
|
« Предыдущая тема | Следующая тема » |
|
|