Что может привести к тому, что закрытия обработки событий перестанут работать? - PullRequest
0 голосов
/ 22 ноября 2010

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

//reduced to the logic in question:
buttons.forEach(function(button:EventDispatcher, i:int, list:Array):void {
  button.addEventListener(MouseEvent.MOUSE_OVER, function(e:Event):void {
    button.filters = [button_glow_filter];
  });
});
//button-specific click handlers:
buttons[0].addEventListener(MouseEvent.MOUSE_CLICK, handle_some_action);

Это работает некоторое время, пока я не выполню несвязанное действие с пользовательским интерфейсом.Это очень сложная система, поэтому я не совсем уверен, что происходит.Я могу подтвердить, что несвязанное действие не оказывает прямого влияния на объект, который содержит кнопки или сами кнопки (по крайней мере, он ничего не меняет через общедоступные интерфейсы).Кнопки все еще существуют, и слушатели событий щелчка по-прежнему работают правильно, потому что им индивидуально назначены реальные функции на интерфейсе класса.

Поэтому мой вопрос: кто-нибудь знает, что может заставить эти замыкания перестать обрабатывать события MouseOverбез какого-либо другого ощутимого влияния на связанные объекты?

Есть несколько способов выполнить это поведение MouseOver, и на данный момент я переключился на один, который работает, но я все еще хотел бы знать,ответ на этот вопрос для дальнейшего использования.

1 Ответ

1 голос
/ 22 ноября 2010

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

buttons.forEach(function(button:EventDispatcher, i:int, list:Array):void {
  button.addEventListener(MouseEvent.MOUSE_OVER, function(e:Event):void {
    button.filters = [button_glow_filter];
  }, false, 0, false);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...