2

我最近更改为 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 甚至在应用程序根目录中捕获事件。

如果有人对 Mate 有任何经验,我将不胜感激。也许我做这一切都错了。我只想从服务器获取结果 - 查看结果并根据结果再次联系服务器。应该很简单。

活动地图:

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

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

            </faultHandlers>
    </RemoteObjectInvoker>

4

3 回答 3

7

通常的做法是将事件映射的调度程序注入到对象中:

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

于 2009-01-27T08:13:29.873 回答
4

经过一番挖掘我发现你不能从非视图类中调用事件。该论坛帖子描述了优雅的解决方案,并提供了一个快速的解决方法:

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

但是请查看论坛帖子-那里有很多肉。

于 2009-01-27T03:05:55.690 回答
0

您可以从 actionscript 中的类调度事件。为此,它必须扩展 EventDispatcher 类或使用一些调度程序属性并实现 IEventInterface。但这不是正确的方法,因为事件不会冒泡,因为冒泡是特定于显示对象的属性。您可以在目标阶段收听类本身中的事件。如果您希望其他节点监听事件,它必须冒泡。因此,正如 Theo 回答的那样,您必须将 mate 框架的调度程序传递给班级。现在您可以从类中分派事件。这可能是从数据类分派事件的最佳方式。有关更多信息,请参阅此链接http://www.developria.com/2010/05/pass-the-eventdispatcher-pleas.html

于 2012-10-18T11:24:07.727 回答