Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.02.2014, 19:13
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 1  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
По умолчанию не удаляется слушатель

Создал объект arst, добавил ему слушателя:
Код AS3:
arst.addEventListener(MyEvent.BOOM, boom)
Объект распространяет событие:
Код AS3:
dispatchEvent(new MyEvent(MyEvent.BOOM))
Родитель ловит событие:
Код AS3:
private function boom(e:MyEvent): void {
var arst:Object = e.target;
arst.removeEventListener(MyEvent.BOOM, boom)
trace('BOOOOOOOOOOOOOOOOOOOOOM!!!!!!!')
};
Проблема в том, что слушатель почему-то не удаляется, хотя много раз использовал такую схему. В чём беда в этот раз, никак не пойму. Добавил проверку hasEventListener, чтобы проверить, есть ли слушатель, перед его удалением:
Код AS3:
private function boom(e:MyEvent): void {
var arst:Object = e.target;
trace(arst.hasEventListener('BOOM'))
arst.removeEventListener(MyEvent.BOOM, boom)
trace('BOOOOOOOOOOOOOOOOOOOOOM!!!!!!!')
};
trace(arst.hasEventListener('BOOM')) выводит "true", т.е. слушатель есть. А удаляться, гад, не хочет, выбрасывает
Код AS3:
[Fault] exception, information=TypeError: Error #2007: Параметр listener не должен быть равен нулю.
Подскажите, пожалуйста, в чём дело?

Старый 14.02.2014, 19:35
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Попробуйте currentTarget написать.

Старый 14.02.2014, 19:41
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 3  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Попробуйте currentTarget написать.
К сожалению, не помогло - всё то же самое((

Старый 14.02.2014, 19:48
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 4  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
А покажите константу MyEvent.BOOM, у неё значение 'BOOM' ?

Старый 14.02.2014, 19:53
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 5  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
А что это у вас за игра с ";"?
Там где нужно ставить - нет, там, где не нужно - стоит...

Добавлено через 4 минуты
Скорее, всё дело в константе BOOM.

Добавлено через 5 минут
Код AS3:
trace(arst.hasEventListener(MyEvent.BOOM))
что выдает?

Добавлено через 7 минут
Секунду... Нет, вряд ли там дело в константе.

Добавлено через 10 минут
Может быть, дело в том, что вы установили e.target as Object? Попробуйте поставить var arst:Тип вашего класса, который был указан при создании.

Старый 14.02.2014, 20:08
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 6  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от SuriTheAngel Посмотреть сообщение
А что это у вас за игра с ";"?
Там где нужно ставить - нет, там, где не нужно - стоит...
привык в конце строчек ставить ";", чтобы акцентировать конец строки. Проблем с этим пока не было, если не совать этот знак в xml, поэтому сомневаюсь насчёт "не нужно". А вот насчёт "где нужно" - буду признателен, если просвятите, где данный знак обязателен вообще и в моём коде в частности.

Цитата:
Сообщение от SuriTheAngel Посмотреть сообщение
Код AS3:
trace(arst.hasEventListener(MyEvent.BOOM))
что выдает?
я же написал - выдаёт true

Как бы там ни было, проблему я уже решил: оказалось, что внутри функции boom() почему-то нельзя было удалять слушателей, которые на него ссылаются. Как только я перенёс removeEventListener за пределы функции boom(), всё заработало. Чудеса, да и только!

Добавлено через 3 минуты
Цитата:
Сообщение от SuriTheAngel Посмотреть сообщение
Может быть, дело в том, что вы установили e.target as Object? Попробуйте поставить var arst:Тип вашего класса, который был указан при создании.
Я так пытался делать много раз, не только в этом случае. Вылазит ошибка и требует указывать тип Object. Поэтому у меня практически везде, где в функции, вызываемой событием, есть обращение к цели, приходится указывать переменным, которые к ней приравниваются, тип Object

Старый 14.02.2014, 23:41
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
привык в конце строчек ставить ";", чтобы акцентировать конец строки...А вот насчёт "где нужно" - буду признателен, если просвятите
В конце строки и нужно. А не после скобки.

Цитата:
Вылазит ошибка и требует указывать тип Object.
Вылазит ошибка, говорящая, что возвращаемый тип — Обжект (а чего Вы ждали? Что компилятор перепишет нативную функцию, чтоб возвращать Ваш кастомный тип?). Все, что нужно, это кастануть объект к вашему классу:
Код AS3:
var eventTarget:MyClass = event.target as MyClass;
В данном конкретном примере используются только методы диспатчера, так что можно было кастануть к нему
Код AS3:
var arst:EventDispatcher = e.target as EventDispatcher;
arst.removeEventListener(MyEvent.BOOM, boom);
__________________
Reality.getBounds(this);

Старый 17.02.2014, 13:50
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 8  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Спасибо за пояснения!

Насчёт ";":
Цитата:
Сообщение от Wolsh Посмотреть сообщение
В конце строки и нужно. А не после скобки.
если Вы про это:
Код AS3:
private function boom(e:MyEvent): void {
//...
};
То ";" ведь и стоит в конце строки. Или я не так понимаю словосочетание "конец строки"?

Я, на самом деле, немного не так выразился. Я стараюсь ставить ";" не только в конце строки, но во всех местах разделения логических частей. Поэтому предпочитаю писать код так:
Код AS3:
a=10;
b=2;
while (a--) {b++};
а не так:
Код AS3:
a=10
b=2
while (a--) {b++}
.
Если первый вариант чем-то плох, уточните, чем. А то я до сих пор думал, что ставить ";" - это всё равно, что ставить скобочки в конструкции
Код AS3:
()?():()
- т.е. работать будет и без них, но лучше ставить, потому что так и надёжнее и опрятнее.

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:35.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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