Я не могу отправить пользовательское событие из одного модуля в другой, так как оно приводит к ошибке TypeError: Error #1034: Ошибка приведения типа:
Я пытаюсь отправить пользовательское событие из одного модуля Flex в другой.
Код, который отправляет событие, как показано ниже
Application.application.Destination.child.dispatchEvent(
new AlgoEvent(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));
здесь AlgoEvent - пользовательское событие
с другой стороны модуль, который перехватывает и обрабатывает событие, имеет следующий код:
public function sendParametersToChild(e:AlgoEvent):void
{
//some codes
}
но когда утверждение Application.application.Destination.child.dispatchEvent(new AlgoEvent(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));
при выполнении отладчика выдается следующее исключение времени выполнения:
TypeError: Error #1034: Type Coercion failed: cannot convert resources.events::AlgoEvent@4182239 to resources.events.AlgoEvent.
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9298]
at components::Destination/sendTimeToChild()[E:\FlexProjects\MyApp\src\components\Destination.mxml:99]
at components::Destination/updateParameters()[E:\FlexProjects\MyApp\src\components\Destination.mxml:206]
at components::Destination/__CreateBasketButton_click()[E:\FlexProjects\MyApp\src\components\Destination.mxml:558]
Я не могу определить, что здесь происходит не так. Пожалуйста, помогите решить эту проблему
Это мой класс Event
public class AlgoEvent extends Event
{
public static const GETFROMPARENT_LOCAL_EVENT:String = "getfromparent_local";
private var eventType:String;
public function AlgoEvent(eventType:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(eventType,bubbles,cancelable);
this.eventType=eventType;
}
}
Во время отладки я получаю сообщение об ошибке в этой функции класса UIComponent
override public function dispatchEvent(event:Event):Boolean
{
if (dispatchEventHook != null)
dispatchEventHook(event, this);
return super.dispatchEvent(event);
}
В точности эта строка выдает ошибку: dispatchEventHook(event, this);
7 ответов
Импортировать AlgoEvent
Класс в основном приложении и создать ссылку на него.
import resources.events.AlgoEvent;
private var dummyEvent: AlgoEvent;
Некоторые объяснения этому можно найти здесь: Домены модуля
Если ваше пользовательское событие не содержит каких-либо специальных свойств события, вы можете обойти вашу проблему, используя стандартные Event
учебный класс.
dispatchEvent(new Event(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));
У меня была такая же проблема при диспетчеризации, решена переопределение двух функций:
override public function clone():Event
{
return new AlgoEvent(type, bubbles, cancelable);
}
override public function toString():String
{
return formatToString("AlgoEvent","type"","bubbles","cancelable","eventPhase");
}
надеюсь, это поможет:)
Мистер Сплэш предложил решение, которое сработало для меня:
Попробуйте сделать класс Custum Event (Algo Event в моем случае) известным основным приложением.
Т.е. импортируйте его в основное приложение и создайте его переменную.
И это работает по главной причине >> когда мы пытаемся связаться между модулями, используя диспетчеризацию событий, происходит следующее: модули загружаются во время выполнения, но такие классы, как классы событий, связаны с модулями во время выполнения. класс Event компилируется до загрузки модулей.
Приложение определяет класс событий Custum во время компиляции, а модуль определяет свой собственный класс событий Custum, когда он публикуется. Затем, когда приложение запущено, класс событий Custum, отправленный в приложение, не совпадает с классом в модуле swf.
Для проблемы, которая вызывает эту ошибку, можно проверить ссылку:
http://www.kirupa.com/forum/showthread.php?t=320390
а также
http://www.jeffdepascale.com/index.php/flash/custom-events-in-loaded-swf-files/
Ваш пользовательский класс Event должен выглядеть следующим образом:
public class AlgoEvent extends Event
{
public static const GETFROMPARENT_LOCAL_EVENT:String = "getfromparent_local";
public function AlgoEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
};
override public function clone():AlgoEvent
{
return new AlgoEvent(type, bubbles, cancelable);
};
};
Вы должны использовать свойство наследуемого типа события вместо создания нового.
Так же UIComponent
имеет свой dispatchEvent
метод, так что вам не нужно создавать свой собственный - только если он работает иначе, чем унаследованный.
С уважением, Роб
Попробуйте переопределить метод clone() в настраиваемом событии AlgoEvent. Добавьте следующий код в свой класс AlgoEvent.as и попробуйте:
переопределить публичную функцию clone():Event{ return new AlgoEvent(eventType,bubbles,cancellable); } HTH.
Mate Framework заботится обо всем этом. Это дает вам глобальную шину событий для всех модулей в вашем приложении. http://mate.asfusion.com/
Хорошо, нужно сказать, что то, что вы делаете, с архитектурной точки зрения, неправильно. Вызов Application.application плох по многим причинам, особенно если вы начинаете спускаться по дереву отображения. Во время изменения любого дочернего элемента ваша сборка теперь сломана, и вы не узнаете об этом до времени выполнения, потому что это модуль.
Что вам нужно, это структура приложения. Способ увеличить сложность, не уменьшая ремонтопригодность. Их там много, но мой любимый - Петрушка. Я использовал его во многих очень крупных проектах с большим успехом. Проблема, которую вы пытаетесь решить прямо сейчас, отправка одного события, когда другой модуль его слушает, чрезвычайно тривиальна (это можно сделать примерно за 3 строки кода).
Я рекомендую вам просмотреть его, а также мою презентацию о введении в петрушку.