Flex - платформа Mate - отправка событий

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

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

Then in the class I'd like to dispatch an event.

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 или даже в корне приложения.

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

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

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

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

            </faultHandlers>
    </RemoteObjectInvoker>


person user17510    schedule 27.01.2009    source источник
comment
Можете ли вы опубликовать больше своей EventMap? Я хотел бы посмотреть, как настроены ваши обработчики событий.   -  person Mike Sickler    schedule 27.01.2009


Ответы (3)


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

<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.

person Theo    schedule 27.01.2009
comment
Однако на самом деле нет способа использовать Mate CallBack с глобальным диспетчером, верно. Я имею в виду, что CallBack вернется к экземпляру глобального диспетчера, а не к экземпляру вызывающего диспетчера, например модели представления или диспетчера. - person xantrus; 26.05.2011

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

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

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

person Mike Sickler    schedule 27.01.2009
comment
Спасибо за это, Майк. Я добавил закрывающий тег. Итак, должен ли я иметь возможность прослушивать отправку событий из классов, созданных с помощью тега methodInvoker из той же карты? - person user17510; 27.01.2009
comment
Хороший. В этом есть смысл. Я использовал этот стиль раньше, но при отправке события из средства визуализации элементов. В любом случае, спасибо. - person user17510; 27.01.2009
comment
Я написал это сообщение на форуме (№2 сверху), и это решение - уродливый хакер, и я настоятельно не рекомендую никому его использовать. Поищите мой ответ на этот вопрос или прочтите всю публикацию на форуме, где вы найдете более надежное решение. - person Theo; 27.01.2009
comment
Ты прав, Тео, я должен был быть более ясным в ответе, что приведенный выше блок кода - это быстрый и грязный взлом. - person Mike Sickler; 27.01.2009
comment
Большое спасибо, приятель ... 4 часа изо всех сил пытался разобраться в этой проблеме. - person Kevin; 15.12.2009

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

person nitin    schedule 18.10.2012