使用PopUpManager进行事件的最佳方式?

时间:2011-04-07 18:18:51

标签: flex events flex3 adobe cairngorm

如果我使用PopUpManager添加一个孩子,并且我从该孩子发送一个事件,那么气泡似乎不会出现在我的应用程序(主应用程序)的顶部。

例如:

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

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

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

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

有什么想法吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

试试这个

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

我实际上并不是调用Application.application的忠实粉丝,因为它降低了组件模型的可重用性,但是在紧要关头它可以工作。

答案 3 :(得分: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"));
  }
}

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