Flex - Mate framework - диспетчеризация событий - PullRequest
2 голосов
/ 27 января 2009

Я недавно перешел на Mate в качестве основы для flex. Однако я сталкиваюсь с несколькими проблемами. Я хочу знать, как отправлять события из классов, генерируемых с помощью тега methodInvoker.

<resultHandlers>
        <MethodInvoker generator="{LoginSuccess}" method="setCurrentUser" arguments="{[resultObject]}"/>

Тогда в классе я бы хотел отправить событие.

public function setCurrentUser(calUser:Object):void{
        if(calUser != null){
            Model.instance.currentUser = calUser as CalUser;
            loadOnlineCalendars(Model.instance.currentUser);
        }
    }

    public function loadOnlineCalendars(calUser:CalUser):void{
        for(var i:int = 0 ; i<calUser.calConnectors.length; i++){//logic here
            dispatchEvent(new CalConnectorEvent(calUser.calConnectors as CalConnector,CalConnectorEvent.LOAD_ONLINE_CALENDAR_EVENT,true));
        }
    }

Проблема в том, что я не могу поймать событие в EventMap или даже в корне приложения.

Если у кого-нибудь есть опыт общения с Мате, я был бы признателен за некоторые советы. Возможно, я делаю все это неправильно. Я просто хочу получить результат с сервера - посмотрите на результат и, в зависимости от результата, снова обратитесь к серверу. Должно быть довольно просто.

Карта событий:

            <resultHandlers>
            <MethodInvoker generator="{LoginSuccess}" method="setCurrentUser" arguments="{[resultObject]}"/>
            <ServiceResponseAnnouncer type="result"/>

            </resultHandlers>
            <faultHandlers>
            <ServiceResponseAnnouncer type="fault"/>

            </faultHandlers>
    </RemoteObjectInvoker>

Ответы [ 3 ]

7 голосов
/ 27 января 2009

Обычно это делается для того, чтобы внедрить диспетчер карты событий в объект:

<MethodInvoker generator="{MyClass}" method="someMethod" arguments="{[a, b]}">
  <Properties dispatcher="{scope.dispatcher}"/>
</MethodInvoker>

Внутренний тег Properties устанавливает свойства объекта, создаваемого MethodInvoker, и свойства гарантированно устанавливаются до вызова метода.

Очевидно, что класс должен иметь публичное свойство с именем dispatcher (или любым другим именем, которое вы предпочитаете), чтобы это работало. Для отправки событий, которые вы хотите прослушать в карте событий, вызовите dispatcher.dispatchEvent(...).

Если объект, созданный с помощью MethodInvoker, будет использоваться более одного раза, если, скажем, это менеджер, общая идиома состоит в том, чтобы создать его с помощью ObjectBuilder - это блок обработчика событий, который запускается FlexEvent.INITIALIZE :

<EventHandlers type="{FlexEvent.INITIALIZE}">
  <ObjectBuilder generator="{MyClass}" constructorArguments="{scope.dispatcher}"/>
</EventHandlers>

В этом примере диспетчер событий внедряется как аргумент конструктора, но вы можете использовать внутренний тег Properties так же, как с MethodInvoker.

4 голосов
/ 27 января 2009

После некоторого разбора вокруг здесь я обнаружил, что вы не можете вызвать событие из класса без просмотра. Этот пост на форуме описывает элегантное решение, а также предлагает быстрый обходной путь:

Application.application.dispatchEvent(new CalConnectorEvent(calUser.calConnectors as CalConnector,CalConnectorEvent.LOAD_ONLINE_CALENDAR_EVENT,true));

Но посмотрите на пост на форуме - там много мяса.

0 голосов
/ 18 октября 2012

Из класса в ActionScript вы можете отправлять события. Для этого он должен либо расширить класс EventDispatcher, либо использовать какое-либо свойство диспетчера и реализовать IEventInterface. Но это не правильный путь, потому что событие не будет пузыриться, так как пузыри являются свойством, специфичным для экранных объектов. Вы можете прослушать событие в самом классе во время целевой фазы. Если вы хотите, чтобы другие узлы слушали событие, оно должно всплыть. Так как Тео ответил, вы должны передать диспетчеру сопряженной структуры классу. Теперь вы можете отправить событие из класса. Это, вероятно, лучший способ отправки событий из классов данных. Для получения дополнительной информации перейдите по этой ссылке http://www.developria.com/2010/05/pass-the-eventdispatcher-pleas.html

...