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

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

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

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
По умолчанию совместное использование Delegate и EventDispatcher

Все знают, что Delegate.create каждый раз возвращает новый объект. И подписавшись раз на событие таким макаром
Код:
myObject.addEventListener("myEvent", Delegate.create(myOtherObject, myOtherObjectMethod));
Отписаться от него потом весьма проблематично.

Можно отписаться от него в самом методе в момент вызова через arguments.caller (с) NoxNoctis

А если надо извне, в любой другой момент?
Вот, тут подумалось, что можно просто обойти цепочку:
Код:
class DelegateRemover {
	public static function removeDelegate(dispatcher, event, obj, func) {
		var queue = dispatcher["__q_"+event];
		var l:Number = queue.length;
		var i:Number;
		for (i=0; i<l; i++) {
			var o = queue[i];
			if (typeof(o) == "function" && o.target == obj && o.func == func) {
				queue.splice(i, 1);
				return;
			}
		}
	}
}
Скажем есть класс
Код:
import mx.utils.Delegate;
//
class MyClass {
	var id;
	function MyClass(ID) {
		id = ID;
	}
	function addEvent(event, obj) {
		obj.addEventListener(event, Delegate.create(this, report));
	}
	function report(obj) {
		trace(id+"  "+obj.type);
	}
}
В первом кадре пишем:
Код:
import mx.events.EventDispatcher;

var mo = new Object();
EventDispatcher.initialize(mo);  // Создали вещатель

myC1 = new MyClass("myC1");  
myC1.addEvent("onEvent", mo);  // Создали экземпляр myClass и подписали его на onEvent

myC2 = new MyClass("myC2");
myC2.addEvent("onEvent", mo); // Создали контрольный экземпляр

mo.dispatchEvent({type:"onEvent"});  //  trace  myC2  onEvent  myC1  onEvent
trace("_____________________________________________");
DelegateRemover.removeDelegate(mo, "onEvent", myC1, myC1.report); // удалили
mo.dispatchEvent({type:"onEvent"});  // trace myC2  onEvent
__________________
...Тебе страшно? Мне - нет.


Последний раз редактировалось Ромастый; 20.12.2006 в 18:12.
Создать новую тему   Часовой пояс GMT +4, время: 18:16.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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