Как передать параметры/переменные через прослушиватели событий? Я довольно успешно преодолел эту проблему, используя анонимные функции; который является невероятно простым решением, но в конце дня он пахнет гигантской лазейкой для функциональности, которая, как мне кажется, должна предоставляться изначально в любом случае.
Обычно жизнь продолжалась, но по мере того, как судьба имела это, теперь мне действительно нужно удалить слушателя, и это, когда вы используете анонимную функцию, немного напуган. Итак, еще раз, я пытаюсь понять, как передавать параметры через прослушиватели событий, чтобы прослушиватели событий могли быть удалены, просто ссылаясь на функцию.
Как ни странно, я тоже преодолел эту проблему, но мне это не нравится и надоело ее использовать. По-моему, это запах кода. Но это работает как шарм. Я храню переменную, объект или что-то другое в диспетчерском MovieClip. Итак, если я зацикливаю массив массива данных, создавая эскизы "на лету", я просто храню переменную данных (обычно объект с несколькими свойствами) в фактическом thumbnail MovieClip. Затем я могу получить доступ ко всем данным в методе прослушивания событий, указав:
event.target.data. В этом примере "данные" - это имя переменной, удерживающей информацию, которую я хочу. Поскольку другая проблема, которая возникает, когда я не использую это, заключается в том, что когда я перебираю массив и создаю миниатюры, которые нажимают для просмотра больших изображений, индекс не является согласованным. В конце цикла ВСЕ удачи будут открывать изображение, используя последний индекс "i". Поэтому, если бы у меня был массив длиной 12, все они загрузили бы 12-е изображение, независимо от того, на какой эскиз вы нажали. Сохраняя данные в самом MovieClip, создается сплошная ссылка, которая никогда не изменяется.
Это беспокоило меня уже некоторое время. В основном, что я хочу знать, - это хорошая практика, есть ли там лучшие решения?
Ниже приведены примеры диеты. При необходимости я могу разместить более подробные примеры. Все примеры изображают эскиз, который загружает большое изображение при нажатии.
Без использования анонимной функции (проблема):
tempThumb.addEventListener(MouseEvent.CLICK, loadImage); public function loadImage(_event:MouseEvent):void { // I don't have the variable _url and preparing a hot bath with a cold blade }
Использование анонимной функции:
tempThumb.addEventListener(MouseEvent.CLICK, function(_event:MouseEvent) { loadImage("large.jpg"); } ); public function loadImage(_url:String):void { // I got the variable _url and packing away the razor blades }
Без использования анонимной функции, но используя мой вонючий метод Leprechaun хранения данных в MovieClip, отправляющий событие
tempThumb.data = "large.jpg"; tempThumb.addEventListener(MouseEvent.CLICK, loadImage); public function loadImage(_event:MouseEvent):void { trace(event.target.data); // I can access the variable }
Я не опираюсь на терминологию программирования, поэтому я назвал вышеупомянутую Методику Лепрекона. Сохранение/скрытие переменных в объектах для последующего использования/доступа. Он решает все мои проблемы и работает удивительно хорошо. Но, если есть лучший способ сделать это, я хочу знать об этом.