Я не могу отправить пользовательское событие из одного модуля в другой, так как оно дает ошибку TypeError: Error # 1034: Ошибка приведения типа - PullRequest
3 голосов
/ 23 марта 2011

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

3 голосов
/ 23 марта 2011

Импортируйте класс AlgoEvent в основное приложение и создайте ссылку на него.

import resources.events.AlgoEvent;
private var dummyEvent: AlgoEvent;

Некоторые объяснения этому можно найти здесь: Домены модуля

Если ваше пользовательское событие не содержит каких-либо специальных свойств события, вы можете обойти вашу проблему, используя стандартный класс Event.

dispatchEvent(new Event(AlgoEvent.GETFROMPARENT_LOCAL_EVENT));
2 голосов
/ 14 мая 2011

У меня была такая же проблема при отправке, решена переопределение двух функций:

override public function clone():Event
{
    return new AlgoEvent(type, bubbles, cancelable);
}

override public function toString():String
{
        return formatToString("AlgoEvent","type"","bubbles","cancelable","eventPhase");
}

надеюсь, это поможет:)

1 голос
/ 23 марта 2011

г.splash предложил решение, которое сработало для меня:

Попробуйте сделать класс 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/

0 голосов
/ 23 марта 2011

Хорошо, нужно сказать, что то, что вы делаете, с архитектурной точки зрения, неправильно. Вызов Application.application плох по многим причинам, особенно если вы начинаете спускаться по дереву отображения. Во время изменения любого дочернего элемента ваша сборка теперь сломана, и вы не узнаете об этом до времени выполнения, потому что это модуль.

Что вам нужно, это структура приложения. Способ увеличить сложность, не уменьшая ремонтопригодность. Их много, но мой личный фаворит - Петрушка . Я использовал его во многих очень крупных проектах с большим успехом. Проблема, которую вы пытаетесь решить прямо сейчас, отправка одного события, когда другой модуль его слушает, чрезвычайно тривиальна (это можно сделать примерно за 3 строки кода).

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

0 голосов
/ 23 марта 2011

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

С уважением, Rob

0 голосов
/ 23 марта 2011

Попробуйте переопределить метод clone () в настраиваемом событии AlgoEvent. Добавьте следующий код в свой класс AlgoEvent.as и попробуйте:

переопределить публичную функцию clone (): Event { вернуть новый AlgoEvent (eventType, bubbles, Cancellable); } НТН.

0 голосов
/ 23 марта 2011

Mate Framework позаботится обо всем этом. Это дает вам глобальную шину событий для всех модулей в вашем приложении. http://mate.asfusion.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...