1

如果我使用 PopUpManager 添加一个孩子,并且我从那个孩子分派了一个事件,那么气泡似乎不会冒泡到我的应用程序(主应用程序)的顶部。

例如:

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

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

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

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

有任何想法吗?

谢谢!

4

4 回答 4

2

试试这个

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

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

于 2011-04-07T18:44:38.920 回答
2

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

于 2011-04-07T19:43:13.017 回答
0

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

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

于 2011-04-07T21:21:17.793 回答
0

我对 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"));
  }
}

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

于 2011-04-07T21:42:45.597 回答