Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как передать параметр в общую функцию события (http://www.flasher.ru/forum/showthread.php?t=107391)

Rzer 31.01.2008 17:52

Как передать параметр в общую функцию события
 
Есть код:
Код:

                function loadLibrary(name,path) {
                  var url:URLRequest = new URLRequest(path);
                  //КАК ЗДЕСЬ ПЕРЕДАТЬ ПАРАМЕТР NAME в функцию onLibraryLoaded
                    var l:Loader = new Loader();
                    l.contentLoaderInfo.addEventListener(Event.COMPLETE, onLibraryLoaded);
                    l.load(url);
                }
                private function onLibraryLoaded(e:Event){ //загрука карты прошла успешно
                        //КАК ЗДЕСЬ ПОЛУЧИТЬ ПАРАМЕТР NAME???
                }

Собственно вопрос в коде

etc 01.02.2008 04:50

Вы знаете, что такое поля класса? Если в один момент времени может грузится только одна либа, то используйте поле класса для хранения данных. Если нет, то напишите наследника Loader с необходимыми полями и грузите через него. Соответственно, при получении события, можно сослаться на target и получить необходимые данные. Либо написать делегата:

Код:

function resizeHandler(event:Event, ...rest):void {
        trace(event, rest);
}
var delegate:Function = function(scope:Object, func:Function, ...rest):Function {
        return function(...args):void {
                func.apply(scope, args.concat(rest));
        }
}
super.stage.addEventListener(Event.RESIZE, delegate(this, this.resizeHandler, 1, 2, 3));

Хотя этот вариант не очень хорош.

Rzer 01.02.2008 19:01

Delegate работает как надо.

2 _etc огромное спасибо.

terbooter 27.02.2008 08:09

Мне тоже Delegate очень помог.

>Хотя этот вариант не очень хорош.
А в чем его недостатки?

etc 27.02.2008 12:31

В том, что отписаться от такого обработчика сложно. Это как минимум.

Snut 27.02.2008 13:08

ну например можно написать класс типа
Код:

//ChangeDateEvent.as

package Loaders.ModulesLoader
{
        import flash.events.Event;

        public class ChangeDateEvent extends Event
        {
                public static const DATE:String="DATE";
                private var _dateValue:Date;
               
                public function ChangeDateEvent(type:String, date:Date)
                {
                        this.dateValue = date;
                        super(type);
                }
                public function set dateValue(value:Date):void
                {
                        _dateValue = value;
                }
                public function get dateValue():Date
                {
                        return _dateValue;
                }
        }
}

так у меня модули общались между собой не зная друг о друге

CrazyFlasher 27.02.2008 14:47

расширять класс Event своим классом и передавать всё что нужно

terbooter 28.02.2008 08:14

Я тоже раньше думал что кастомные события покрывают весь спектор возможных случаев, пока не столкнулся с необходимостью передавать параметр.

etc 28.02.2008 09:53

Цитата:

Сообщение от terbooter
Я тоже раньше думал что кастомные события покрывают весь спектор возможных случаев, пока не столкнулся с необходимостью передавать параметр.

В чем проблема передать параметр вместе с событием?
У меня никогда не возникало ситуации, когда нужен подобный делегат.

Snut, геттер и сеттер в событии не нужен, нужна обычная публичная переменная (кроме случаев, когда нужно сделать возможность указания значения только в конструкторе, тогда пишется только геттер). А ещё надо описывать метод clone(), иначе при всплытии события придёт не то событие, которое ожидаешь.

CrazyFlasher 28.02.2008 11:09

Код:

package {
        import flash.events.Event;
        public class MyEvent extends Event {
                public static var COOL_EVENT:String = "COOL_EVENT";
               
                public var param:*;
               
                public function MyEvent(type:String, param:*) {
                        this.param = param;
                       
                        super(type);
                }
        }
       
}
.......
//кастомный евент для dispatchera
dispatchEvent(new MyEvent(MyEvent.COOL_EVENT, myParam));

можно ещё так:
Код:

l.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event){
      onLibraryLoaded(name);
});

private function onLibraryLoaded(name:*){ //загрука карты прошла успешно
        trace(name);
}



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

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