Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   никак не могу removeEventListener (http://www.flasher.ru/forum/showthread.php?t=111889)

me2 12.05.2008 02:38

никак не могу removeEventListener
 
Вот такая вот конструкция лежит в классе:
Код:

private var act;
...
private function addFrameEvent(){
        act=function(e:Event){trace('aaa')}
        addEventListener(Event.ENTER_FRAME,act);
}
private function killFrameEvent(){
        removeEventListener('enterFrame',act);
}

Не могу удалить listener. Что не так?

koresh& 12.05.2008 02:45

Код:

removeEventListener(Event.ENTER_FRAME,act);
м?

me2 12.05.2008 02:49

не помогает
он походу не хочет понимать что act является объектом-слушателем...

koresh& 12.05.2008 02:56

Код:

private var act;
...
private function addFrameEvent(){
        addEventListener(Event.ENTER_FRAME,act);
        function act(e:event)
        {
            trace('aaa')
        }
}
private function killFrameEvent(){
        removeEventListener(Event.ENTER_FRAME,act);
}

а ничего, что они private?

me2 12.05.2008 03:05

это не страшно :)

wvxvw 12.05.2008 03:08

А вы не создавайте слушателей, да и функции вообще в теле другой функции (ибо все ссылки на них потруться когда функция отработает), и будет вам счастье =)
Вот как вы себе представляете, вы создали локальную переменныю в функции А, а в функции Б хотите теперь ее увидеть? Переменная должна быть в зоне видимости обеих функций.

me2 12.05.2008 03:17

так я делаю если есть какие то быстрые вычисления или там загрузки...
но в данном случае очень важно удалить слушателя, ибо действия в act "вечные", а вот сам объект к которому они привязаны может "исчезнуть" по желанию юзера, и тогда резко начинаются проблемы, потому как слушатель висит тока слушать ему нечего.

wvxvw 12.05.2008 03:23

Ну вот и не нужно делать "быстро", а нужно хорошо =) Не сможете вы из одной функции добраться до локальной переменной другой функции... это как пересечение параллельных прямых =) Объявите act вне первой функции, и все будет замечательно работать.

addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false)
Соответственно, поменять на true
Это на всякий случай. Не самый лучий вариант, т.как слушатель будет удален безконтрольно, но тоже может пригодиться.

me2 12.05.2008 03:26

Блин, короче мне дико стыдно, всё работает. Полуношная паника была зря, просто пытался удалить ещё не созданную лису.

me2 12.05.2008 03:32

wvxvw: А кстати переменная ведь объявленна вначале класса, область видимости позволяет лазать к ней через разные функции, это примерно... как дохлая корова на параллельных рельсах, полюбому доступ есть

wvxvw 12.05.2008 03:36

Не, то другая переменная, она к функции созданной внутри addFrameEvent не имеет никакого отношения. Флеш не проверяет идентичность имен локальных переменных функции и переменных класса (ФД помоему ругнулся бы на такое).
Код:

var a:String = 'foo';
function b(){
        var a:String = 'oof';
        trace(a);
        trace(this.a);
}
b();


me2 12.05.2008 03:46

Хитрец, ты в функции объявил новую переменную с тем же именем, а я нет. У меня используется одна и таже, поэтому и trace(a) и trace(this.a) выводин одинаковое значение.

wvxvw 12.05.2008 03:55

Цитата:

Сообщение от koresh& (Сообщение 738564)
Код:

private var act;
...
private function addFrameEvent(){
        addEventListener(Event.ENTER_FRAME,act);
        function act(e:event)
        {
            trace('aaa')
        }
}
private function killFrameEvent(){
        removeEventListener(Event.ENTER_FRAME,act);
}


Да где ж тут ссылка?
Чтобы это было ссылкой нужно наоборот:
Код:

private var act:Function;
...
private function addFrameEvent(){
        addEventListener(Event.ENTER_FRAME,act);
        act = function (e:event)
        {
            trace('aaa')
        }
}
private function killFrameEvent(){
        removeEventListener(Event.ENTER_FRAME,act);
}

А, сорь, понял, это код из поста ниже, в оригинально по-другому.

me2 12.05.2008 04:10

вот низ - это моё =)


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

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