Лучший способ сделать события с PopUpManager? - PullRequest
1 голос
/ 07 апреля 2011

Если я использую PopUpManager для добавления дочернего элемента и отправляю событие от этого дочернего элемента, кажется, что пузырьки не всплывают наверх моего приложения (основного приложения).

Например:

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

Затем во всплывающем окне я делаю:

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

У меня есть eventListener в parentApplication (root .mxml) для "testEvent", но он никогда не срабатывает. Из-за этого я отправлял события и прослушивал события в ModelLocator (используя cairngorm). Это, очевидно, не идеально, потому что во многих случаях мне нужно вручную удалять прослушиватели событий.

Есть идеи?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 07 апреля 2011

Если вы хотите перехватывать всплывающие события сверху, вы можете добавить прослушиватель событий в FlexGlobals.topLevelApplication.systemManager.Надеюсь, это поможет.

2 голосов
/ 07 апреля 2011

Попробуйте вместо этого

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

И убедитесь, что вы удаляете этого даже слушателя, когда всплывающее окно закрывается.

0 голосов
/ 08 апреля 2011

Я больше знаком с 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 , оно отправит событие, используя область диспетчера модели презентации, которая будет на том же уровне, что и родительское приложение. Надеюсь, это поможет!

0 голосов
/ 08 апреля 2011

В вашем всплывающем окне вы можете использовать: Application.application.dispatchEvent, если вы сами прослушиваете приложение к Application.application.

Я на самом деле не большой поклонник диспетчеризации Application.application, потому что это уменьшает возможность повторного использования компонентной модели, но в крайнем случае это работает.

...