Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   addEventListener вложенная функция (http://www.flasher.ru/forum/showthread.php?t=141934)

Maraekb 08.07.2010 15:17

addEventListener вложенная функция
 
Можно ли реализовать что то на подобии этого:
Код AS3:

addEventListener(flash.events.MouseEvent.CLICK, tracer = function():*{ trace("бла бла") })


Juice_Green 08.07.2010 15:29

Код AS3:

stage.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void{trace("click")});


Nirth 08.07.2010 15:41

Можно, но есть 2 проблемы:
1) не читабильно
2) нельзя удалить
Код AS3:

addEventListener( MouseEvent.CLICK, function( event:Event ):void { trace( event ) });

С другой стороны можно создать функционал:

Код AS3:

package
{
        import flash.display.SpreadMethod;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.EventPhase;
        import flash.events.MouseEvent;
 
        public class Test extends Sprite
        {
                public function Test()
                {
                        super();
 
                        var first:Sprite = addChild( button() ) as Sprite;
                                first.addEventListener( MouseEvent.CLICK, handler( trace, true, "hello world" ) );
 
                        var second:Sprite = addChild( button() ) as Sprite;
                                second.x = 122;
                                second.addEventListener( MouseEvent.CLICK, handler( trace, false, "hi" ) );
                }
 
                protected function button( color:uint = 0x000000, width:uint = 100, height:uint = 22 ):Sprite
                {
                        var sprite:Sprite = new Sprite;
                                sprite.graphics.beginFill( color );
                                sprite.graphics.drawRect( 0, 0, width, height );
                                sprite.graphics.endFill();
 
                                sprite.buttonMode = true;
                                sprite.useHandCursor = true;
 
                        return sprite;
                }
 
                protected function handler( closure:Function, remove:Boolean = true, ...arguments:* ):Function
                {
                        var wrapper:Function = function( event:Event ):void
                        {
                                closure.apply( null, arguments );
 
                                if( remove )
                                {
                                        event.target.removeEventListener( event.type, wrapper );
                                                                                                          //event.eventPhase == EventPhase.BUBBLING_PHASE ? false : true );
                                }
                        }
 
                        return wrapper;
                }
        }
}

Но AS3 крайне плохо решает вопросы с выделением памяти вложеным функциям, и я не стал бы рекомендовать использовать это часто, хотя временами помогает.

Maraekb 08.07.2010 15:48

Особо я к влож.функциям и не стремлюсь просто было интересно узнать на будующее можно ли в листенерах делать вложеные функции. Спасибо)
Вот пробдема удаления действительно резко меняет дело)))
Но всёровно пригодиться)

Nirth 08.07.2010 15:54

Ну я показал пример с удалением сразу после отработки, например это могут быть события инициализации, правда надо прогонять это дело в профайлере и посмотреть удалились ли все объекты.

Но скажем 5 раз отработать - потом удалть, или добавлять/удалять по каким то условиям – функционально в AS можно убится так делать )

Maraekb 08.07.2010 16:48

А ещё такой вопрос, не по теме правда, А trace("**") Если их много сильно нагружают комп или при компиляции они автоматически удаляются?

Nirth 08.07.2010 17:26

Да нагружают, насчет удаляются не знаю, вообще обычно использую свои собственные логгеры.

wvxvw 08.07.2010 17:29

Можно удалить при компиляции, да нагружают, лучше их ставить в блок, который по условию будет вырезаться компилятором типа:
Код AS3:

CONFIG::debug { trace(...); }

т.как компилятор не особенно корректно их сам вырезает.

Maraekb 08.07.2010 17:38

ок))Учту)
Спасибо)

BlooDHounD 08.07.2010 18:37

Nirth, собственные логеры нагружают ещё больше ) поэтому я всегда удивляюсь этому "обычно".


Часовой пояс GMT +4, время: 02:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.