Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиотизмы: множественный addedToStage.
Запись от BlooDHounD размещена 07.06.2010 в 20:58
для понимания материала необходимы следующие знания:
flash.display.DisplayObject
множественный addedToStage... Вы думаете, что addedToStage срабатывает единожды? как бы не так!
давайте составим цепочку, в которой где в хэдлере на addedToStage будем создавать спрайт и ложить в только что добавленный спрайт (target).
package { import flash.display.Sprite; import flash.events.Event; public class test extends Sprite { public function test() { var s1:Sprite = new Sprite(); s1.addEventListener( Event.ADDED_TO_STAGE, this.handler_addedToStage ); super.addChild( s1 ); } private function handler_addedToStage(event:Event):void { var s2:Sprite = new Sprite(); s2.addEventListener( Event.ADDED_TO_STAGE, trace ); ( event.target as Sprite ).addChild( s2 ); } } }
что же произошло?
нам известно, что событие addedToStage срабатывает внутри вызова addChild. после отработки этого события, метод должен уведомить всех детей о том, что они тоже добавлены на сцену.
как это выглядит?
Код:
addChild +dispatchEvent ++handler +++addChild ++++dispatchEvent — первый наш трэйс +dispatchChildsEvent — второй наш трэйс
обнаружил данную особенность ещё в незапамятные времени Дениска ( etcs.ru ). а я написал хак исправляющий данную штуку. все визуальные объекты у нас унаследованный от класса прослойки, в котором мы отлавливаем все лишнии addedToStage и останавливаем при помощи stopImmediatePropagation.
скорее всего это баг, но чёрт его знает. нам такое поведение не понравилось. исправляется этот баг добавлением одно if. либо выборки детей до первого диспатча. но править его не мне =)
хак:
package blooddy.patch.display { import flash.display.Sprite; import flash.events.Event; /** * @author BlooDHounD * @playerversion Flash 9 * @langversion 3.0 */ public class Sprite extends flash.display.Sprite { //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor */ public function Sprite() { super(); super.addEventListener( Event.ADDED_TO_STAGE, this.handler_addedToStage, false, int.MAX_VALUE, true ); super.addEventListener( Event.REMOVED_FROM_STAGE, this.handler_removedFromStage, false, int.MAX_VALUE, true ); } //-------------------------------------------------------------------------- // // Variables // //-------------------------------------------------------------------------- /** * @private */ private var _addedToStage:Boolean = false; //-------------------------------------------------------------------------- // // Event handlers // //-------------------------------------------------------------------------- /** * @private */ private function handler_addedToStage(event:Event):void { if ( this._addedToStage ) { event.stopImmediatePropagation(); } else { this._addedToStage = true; } } /** * @private */ private function handler_removedFromStage(event:Event):void { this._addedToStage = false; } } }
Всего комментариев 7
Комментарии
![]() ![]() |
|
А кто слушатели удалять будет?
|
![]() ![]() |
|
А кто документацию читать будет?
|
![]() ![]() |
|
И что там в той документации? Тыкни носом меня.
|
![]() ![]() |
|
Четвертый параметр выставлен в true
|
![]() ![]() |
|
А зачем удалять слушатели на самого себя вообще?
|
![]() ![]() |
|
Спасибо за некропост
![]() Буквально только что столкнулся с тем что addedToStage повторно вызывается, соответственно всё инициализируется дважды. Прочитал, и понял что это "нормально". |
![]() ![]() |
|
Мне кажется это багом нельзя называть..
|
Последние записи от BlooDHounD
- Обновление blooddy_crypto.swc до версии 0.5.1 (31.03.2016)
- Кто не успел - тот опоздал (19.04.2011)
- Обновление blooddy_crypto.swc до версии 0.3.1 (29.11.2010)
- blooddy_crypto.swc теперь умеет JSON (13.10.2010)
- Загадочный CommaExpression (06.09.2010)