【问题标题】:Best way to do events with the PopUpManager?使用 PopUpManager 进行活动的最佳方式是什么?
【发布时间】:2011-04-07 18:18:51
【问题描述】:

如果我使用 PopUpManager 添加一个孩子,并从该孩子调度一个事件,气泡似乎不会冒泡到我的应用程序(主应用程序)的顶部。

例如:

PopUpManager.addPopUp( popup, parentApplication as Application, false );

然后在弹出窗口中,我这样做:

dispatchEvent( new Event( "testEvent", true ) );

我在 parentApplication(根 .mxml)中有一个用于“testEvent”的 eventListener,但它从不触发。因此,我一直在调度事件并监听 ModelLocator 上的事件(使用 cairngorm)。这显然不理想,因为在很多情况下我必须手动确保我删除了事件侦听器。

有什么想法吗?

谢谢!

【问题讨论】:

  • 你在做什么? popup.addEventListener("testEvent", callbackFucntion);

标签: apache-flex events flex3 adobe cairngorm


【解决方案1】:

试试这个

var popup:SomePopup = PopUpManager.createPopup(this, SomePopup, true) as SomePopup;
popup.addEventListener(CloseEvent.CLOSE, onClose);

并确保在弹出窗口关闭时删除该监听器。

【讨论】:

  • @J_A_X,只是出于好奇,为什么使用createPopUpaddPopUp 使 parentApplication 能够听到弹出窗口调度的事件?
  • 不,他们几乎做同样的事情,我只是更喜欢 createPopup。父母无法收听任何弹出窗口,因为它们显示在单独的舞台上。如果您将侦听器直接添加到弹出窗口,您只能收听弹出窗口。
  • 我可以听到弹出窗口本身的事件就好了。仅在创建弹出窗口的位置。如果我想要一个冒泡事件,它不会冒泡到父应用程序。
  • 不,不会。你为什么要?如果你真的需要它冒泡到顶部,我会在弹出窗口本身添加一个监听器,然后调度另一个实际上在显示列表中的事件。
  • sigh 你好像不明白。弹出窗口不在同一个显示列表中,因此从弹出窗口中冒泡将永远到达根视图(应用程序)。您需要侦听事件的弹出窗口,然后再次从显示列表上的组件分派。没有其他办法,除非你直接通过 FlexGlobals 调用根视图。
【解决方案2】:

如果您想在顶部捕获冒泡事件,可以将事件侦听器添加到 FlexGlobals.topLevelApplication.systemManager。希望对您有所帮助。

【讨论】:

  • systemManager.addEventListener是flash应用的绝对顶级? PopUpManager 位于 systemManager 下?这是有用的信息。
【解决方案3】:

我对 Mate 比对 Cairngorm 更熟悉,但在这种情况下,我所做的就是用一个模型备份我的弹出窗口并从模型中分派事件。由于模型和主应用程序位于同一级别,因此主应用程序可以听到事件。

更新:

这是一个粗略的例子。

在我的 MainMap.mxml 中,我创建了演示模型的一个实例并将其注入到我的弹出窗口中。

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

<Injectors target="{ MyPopUp }">
    <PropertyInjector targetKey="model" source="{ MyPopUpPresentationModel }"/>
</Injectors>

MyPopUp.mxml 我有我的模型的一个实例。

<fx:Script>
  <![CDATA[
    [Bindable] public var model:MyPopUpPresentationModel;
  ]]>
</fx:Script>

这里是 MyPopUpPresentationModel.as

package
{
  private var dispatcher:IEventDispatcher;
  public function DigitalTagTrackingPresentationModel(target:IEventDispatcher)
  {
    this.dispatcher = target;
  }

  public function dispatchMyCustomEvent():void
  {
    dispatcher.dispatchEvent(new Event("MyCustomEvent"));
  }
}

当您从 MyPopUp.mxml 调用 model.dispatchMyCustomEvent(); 时,它将使用与父应用程序处于同一级别的表示模型调度程序的范围调度事件。我希望这会有所帮助!

【讨论】:

  • 您能详细说明一下吗?听起来很有希望,但我不太明白您所说的“备份弹出窗口”是什么意思。
  • @andrewpthorp,我添加了一个关于如何使用 Mate 执行此操作的快速示例。就像我说的,我对 Cairngorm 不太熟悉,所以希望你能适应它以供你使用。 :)
  • 我喜欢这个解决方案。这是一个 Flex 4 解决方案,但我相信我将能够做一些类似的事情,使其适应 Flex 3/Cairngorm。谢谢!
【解决方案4】:

在您的弹出窗口中,您可以使用: Application.application.dispatchEvent,只要你的监听器本身是附加到Application.application的。

我实际上不太喜欢在 Application.application 上进行调度,因为它降低了组件模型的可重用性,但在紧要关头它确实有效。

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2011-04-07
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多