Я не могу отправить пользовательское событие из одного модуля в другой, так как оно приводит к ошибке 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 строки кода).

Я рекомендую вам просмотреть его, а также мою презентацию о введении в петрушку.

Другие вопросы по тегам