Форум 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=206614)

a7s1h1 14.02.2014 19:13

не удаляется слушатель
 
Создал объект 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 не должен быть равен нулю.

Подскажите, пожалуйста, в чём дело?

Akopalipsis 14.02.2014 19:35

Попробуйте currentTarget написать.

a7s1h1 14.02.2014 19:41

Цитата:

Сообщение от Akopalipsis (Сообщение 1159897)
Попробуйте currentTarget написать.

К сожалению, не помогло - всё то же самое((

Akopalipsis 14.02.2014 19:48

А покажите константу MyEvent.BOOM, у неё значение 'BOOM' ?

ZackMercury 14.02.2014 19:53

А что это у вас за игра с ";"?
Там где нужно ставить - нет, там, где не нужно - стоит...

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

Добавлено через 5 минут
Код AS3:

trace(arst.hasEventListener(MyEvent.BOOM))

что выдает?

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

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

a7s1h1 14.02.2014 20:08

Цитата:

Сообщение от SuriTheAngel (Сообщение 1159901)
А что это у вас за игра с ";"?
Там где нужно ставить - нет, там, где не нужно - стоит...

привык в конце строчек ставить ";", чтобы акцентировать конец строки. Проблем с этим пока не было, если не совать этот знак в xml, поэтому сомневаюсь насчёт "не нужно". А вот насчёт "где нужно" - буду признателен, если просвятите, где данный знак обязателен вообще и в моём коде в частности.

Цитата:

Сообщение от SuriTheAngel (Сообщение 1159901)
Код AS3:

trace(arst.hasEventListener(MyEvent.BOOM))

что выдает?

я же написал - выдаёт true

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

Добавлено через 3 минуты
Цитата:

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

Я так пытался делать много раз, не только в этом случае. Вылазит ошибка и требует указывать тип Object. Поэтому у меня практически везде, где в функции, вызываемой событием, есть обращение к цели, приходится указывать переменным, которые к ней приравниваются, тип Object

Wolsh 14.02.2014 23:41

Цитата:

привык в конце строчек ставить ";", чтобы акцентировать конец строки...А вот насчёт "где нужно" - буду признателен, если просвятите
В конце строки и нужно. А не после скобки.

Цитата:

Вылазит ошибка и требует указывать тип Object.
Вылазит ошибка, говорящая, что возвращаемый тип — Обжект (а чего Вы ждали? Что компилятор перепишет нативную функцию, чтоб возвращать Ваш кастомный тип?). Все, что нужно, это кастануть объект к вашему классу:
Код AS3:

var eventTarget:MyClass = event.target as MyClass;

В данном конкретном примере используются только методы диспатчера, так что можно было кастануть к нему
Код AS3:

var arst:EventDispatcher = e.target as EventDispatcher;
arst.removeEventListener(MyEvent.BOOM, boom);


a7s1h1 17.02.2014 13:50

Спасибо за пояснения!

Насчёт ";":
Цитата:

Сообщение от Wolsh (Сообщение 1159924)
В конце строки и нужно. А не после скобки.

если Вы про это:
Код 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.

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