Лучший способ делать события с PopUpManager?

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

Например:

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

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

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

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

Любые идеи?

Спасибо!


person andrewpthorp    schedule 07.04.2011    source источник
comment
ты делаешь? popup.addEventListener (testEvent, callbackFucntion);   -  person The_asMan    schedule 07.04.2011


Ответы (4)


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

person Jason Towne    schedule 07.04.2011
comment
Не могли бы вы подробнее рассказать об этом? Звучит многообещающе, но я не совсем понимаю, что вы имеете в виду, говоря о резервном копировании всплывающего окна. - person andrewpthorp; 08.04.2011
comment
@andrewpthorp, я добавил быстрый пример того, как я бы сделал это с помощью Mate. Как я уже сказал, я не слишком знаком с Кэрнгормом, так что надеюсь, вы сможете адаптировать его для своего использования. :) - person Jason Towne; 08.04.2011
comment
Мне нравится это решение. Это решение Flex 4, но я верю, что смогу сделать что-то подобное, адаптировав его к Flex 3 / Cairngorm. Спасибо! - person andrewpthorp; 12.04.2011

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

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

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

person J_A_X    schedule 07.04.2011
comment
@J_A_X, Просто из любопытства, зачем использовать createPopUp vs. addPopUp, чтобы родительское приложение могло слышать события, отправляемые всплывающим окном? - person Jason Towne; 07.04.2011
comment
нет, они в значительной степени делают то же самое, просто мне больше нравится createPopup. Родитель не может прослушивать всплывающие окна, потому что они отображаются на отдельной сцене. Вы можете слушать всплывающие окна только в том случае, если вы добавляете слушателей непосредственно к ним. - person J_A_X; 07.04.2011
comment
Я прекрасно слышу события во всплывающем окне. Только там, где создается всплывающее окно. Если мне нужно всплывающее событие, оно не передается родительскому приложению. - person andrewpthorp; 07.04.2011
comment
Нет, не будет. Почему ты? Если вам действительно нужно всплывать наверх, я бы добавил слушателя к самому всплывающему окну, который затем отправляет другое событие, которое фактически находится в списке отображения. - person J_A_X; 07.04.2011
comment
В этом суть всплывающего события. Я не хочу, чтобы он поднимался наверх, не создавая и не отправляя несколько событий. - person andrewpthorp; 08.04.2011
comment
вздох кажется, ты не понимаешь. Всплывающие окна НЕ находятся в том же списке отображения, поэтому всплывающие окна из всплывающего окна никогда не достигнут корневого представления (приложения). Вам нужно будет прослушать всплывающее окно для события, а затем снова выполнить отправку из компонента в списке отображения. Нет другого пути, если вы не вызываете корневое представление напрямую через FlexGlobals. - person J_A_X; 08.04.2011

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

person Wade Mueller    schedule 07.04.2011
comment
systemManager.addEventListener - это абсолютная вершина флеш-приложения? PopUpManager находится под SystemManager? Это полезная информация. - person andrewpthorp; 08.04.2011

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

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

person Dan    schedule 07.04.2011