Форум 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);
}


etc 28.02.2008 12:52

CrazyFlasher, а clone() кто будет описывать?

Во втором коде откуда name у тебя возьмется?

CrazyFlasher 28.02.2008 13:13

1. ага...я тут немного не тот пример указал...для dispatchEvent

2. что касается второго кода, то я просто не стал всё писать:
Код:

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


etc 28.02.2008 13:22

CrazyFlasher, вариант с анонимной функцией по-любому плохой.

Snut 28.02.2008 16:43

Цитата:

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

мне не нравится объявлять публичные переменные, поэтому делаю приватные и пишу сет гет для них, мне кажется это более надежным, а соответственно отлов события -
Код:

addEventListener(CusomEvent.CUSTOM, param, true);

BlooDHounD 28.02.2008 17:07

болие надёжным каким боком? в данном примере ваш вариант просто ущербен.

Snut 28.02.2008 17:09

Ну а как не ущербен?

etc 28.02.2008 17:34

Цитата:

Сообщение от Snut
Ну а как не ущербен?

Говорили же, кастомное событие.

BlooDHounD 28.02.2008 17:37

ну как? тупо паблик вар. без гетеров и сеторов.

Snut 28.02.2008 18:11

Цитата:

Сообщение от __etc
Говорили же, кастомное событие.

а наследование от Event - это разве не кастомное событие?

etc 28.02.2008 18:25

Цитата:

Сообщение от Snut
а наследование от Event - это разве не кастомное событие?

А, про геттеры и сеттеры-то? А нет никакого смысла делать их. Можно делать геттер и то, лишь в том случае, когда значение нужно передавать в конструкторе.

Snut 28.02.2008 18:31

ну просто у меня черт знает откуда привычка создавать приватные переменные с гетерами сетттерами а не просто публичную

BlooDHounD 28.02.2008 18:40

дурацкая привычка

Snut 28.02.2008 18:41

вполне возможно

Slon_vsapogax 01.03.2008 00:29

Можно сделать еще кастомные диспатчеры =) Тогда вообще всех покроют =)

BlooDHounD, почему дурацкая? Не менее дурацкая чем оставлять место для комментов в виде /**\n * \n */ или притормаживать перед пешеходным переходом :) Одна из основных идей создания g/s - это минимизация изменений для клиентов, ведь реализация всегда может измениться.

Конечно, если это объект данных или Value Object то никто g/s делать не будет, но если логика в этом месте может появиться - то почему нет.

etc 01.03.2008 00:42

Цитата:

Сообщение от Slon_vsapogax
Можно сделать еще кастомные диспатчеры =) Тогда вообще всех покроют =)

BlooDHounD, почему дурацкая? Не менее дурацкая чем оставлять место для комментов в виде /**\n * \n */ или притормаживать перед пешеходным переходом :) Одна из основных идей создания g/s - это минимизация изменений для клиентов, ведь реализация всегда может измениться.

Конечно, если это объект данных или Value Object то никто g/s делать не будет, но если логика в этом месте может появиться - то почему нет.

Вместо привычки должна быть трезвая мысль «зачем я тут делаю геттер и сеттер?». Если вразумительного ответа нет, значит бессмысленно тут делать геттер и сеттер. В случае с наследниками событий всё так и есть. Геттер и сеттер сожрут лишнее процессорное время, никакого толку от них не будет.

Slon_vsapogax 01.03.2008 00:51

etc, ну, и я о том же.

Кстати, я тебя уважаю, но делегат с предыдущей страницы это [censored] всему живому :) Но круто, конечно :)

etc 01.03.2008 10:36

Slon_vsapogax, а у нас на форуме не матерятся.

Делегат был написан в качестве примера, что передать параметры вообще можно, но применять его на практике не стоит, уже который раз пишу. По-хорошему, надо писать наследника Loader (или что там) и сохранять параметры в нём.

Iv 03.03.2008 18:07

Цитата:

Сообщение от Snut
ну просто у меня черт знает откуда привычка создавать приватные переменные с гетерами сетттерами а не просто публичную

- и ты чертовски прав.

Iv 03.03.2008 18:22

Rzer:

для твоего случая я знаю два более-менее подходящих подхода:
- создать наследника Loader и нужные данные хранить в нем
- создать Dictionary и хранить там нужный параметр или объект данных.

etc 03.03.2008 18:46

Цитата:

Сообщение от Iv
- и ты чертовски прав.

Привычку, в случае с Event, лучше оставить.
Просто по одной простой причине, что если используются и геттер и сеттер, то никакой выгоды в этом нет. К тому же, жрет лишнюю память.

Iv 03.03.2008 18:57

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

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

etc 03.03.2008 19:08

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


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

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