Отправка события в popupmanager без ссылки на экземпляр - PullRequest
1 голос
/ 25 апреля 2011

У меня довольно большой опыт работы с Flex 4, но мне все еще не нужны фреймворки (я люблю все делать самостоятельно), и я тоже не хочу их использовать, я знаю их преимущества и научился их использовать.из них, но все же, нет.

Как я могу отправить событие в главном приложении и иметь компонент внутри всплывающего менеджера для реагирования на это событие?Все это отправляет событие в основное приложение, а НЕ направляет его на popupmanager или экземпляр компонента. Я хочу иметь возможность запускать событие и не заботиться о том, кто его получает или вообще кто-то на него реагирует, так что если это возможнотогда я не буду заботиться о отслеживании упомянутых всплывающих окон.

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

Ответы [ 3 ]

1 голос
/ 03 августа 2011

Мне кажется, что вы отчаянно нуждаетесь в RobotLegs, вы, кажется, спрашиваете, как создать / использовать систему шины событий, чтобы отключить ваши компоненты, и это именно то, что удивительно в робототехнике.

Одна вещь, на которую вам обязательно стоит обратить внимание - это ActionScript 3 Signals. Сигналы - это подход к созданию строго типизированных событий, таких как .NET Framework, вместо системы событий волшебных строк, и это фантастическое легкое дополнение к любому проекту Flash / Flex.

Другим распространенным способом является одноэлементный паттерн медиатор / контроллер. Допустим, это автомобильное приложение, и у нас есть сервисный уровень, который за кулисами получает некоторые данные с сервера, в то время как наше всплывающее окно отстает от отображаемого. Одним из способов решения этой проблемы является создание одноэлементного контроллера для наших данных, такого как PartsController. Он также имеет несколько публичных константных сигналов типа SingalDataUpdated. Теперь всплывающее окно может сделать что-то вроде PartsController.SignalDataUpdated.add(OnPartsUpdated). OnPartsUpdated - это локальный метод внутри всплывающего окна, который теперь может реагировать на событие по мере необходимости и не связан с каким-либо другим компонентом пользовательского интерфейса. Обычно это тот подход, который мы применяем и который гарантирует, что ни один компонент пользовательского интерфейса не имеет явных сведений о каком-либо другом компоненте пользовательского интерфейса, а вместо этого общается только с контроллерами. Однако необходимо убедиться, что при закрытии всплывающего окна удалить список сигналов.

Опять же, RobotLegs делает больше всего этого для вас и поощряет некоторые очень хорошие архитектурные лучшие практики. Я очень рекомендую вам прочитать их документацию и ознакомиться с ней. Это изменит вашу жизнь, когда вы поймете, насколько модульным и обслуживаемым он помогает создавать ваш код.

Удачи!

Обновление относительно контекста и синглетонов Идея относительно контекста состоит в том, чтобы создать единственный синглтон, известный как контекст вашего приложения, который хранит экземпляры того, что будет вашими другими синглетонами. Инверсия управления (IoC) и RobotLegs просто соединяют все вместе, так что это не выглядит абсолютной ерундой для работы, но вы можете просто использовать простой инжектор IoC, такой как Swiz или SwiftSuspenders , на которых построен RobotLegs. Так, например, вы можете нажать конкретный контроллер, например:

AppContext.Instance.ProductController.SignalProductAdded.add(OnProductAdded);

Но немного нелепо пытаться получить доступ ко всему таким образом. Здесь на помощь приходит RobotLegs. Вместо этого определите правила внедрения в контексте RobotLegs, поэтому, если компонент запрашивает UserController через тег метаданных ввода, все получает тот же UserController. Точно как синглтон, но правильно, так что в вашем компоненте определите;

[Inject] public var _objProductController:ProductController;

Теперь ваш компонент может работать с объектом контроллера, как если бы он был его собственным, но вместо этого он был добавлен RobotLegs при создании. Для меня и большинства моих продуктов я создаю несколько базовых объектов, таких как GroupBase, PanelBase, PopupPanelBase и т. Д., Которые расширяют надлежащий компонент и уже имеют все свойства ввода контроллера, поэтому любой компонент, полученный из них, уже подключен к соответствующим контроллерам по мере необходимости.

Для вашего простого проекта все равно, что проще свернуть свой собственный и просто создать единый синглтон для вашего контекста, который будет содержать ваши контроллеры и таким образом взаимодействовать с контекстом приложения. Все это довольно высокоуровневые архитектурные решения, и на этом уровне все работают по-разному в зависимости от своего опыта, предпочтений или чего-то еще. Самое главное, что это работает для вас, и вы знакомы с архитектурой. RobotLegs помогает сделать все очень отделенным, что дает некоторые удивительные непредвиденные преимущества позже.

Удачи!

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

Глядя дальше того, что сказал Flextras.com (Джеффри Хаузер, я полагаю), этот подвиг невозможен, события никогда не всплывают для детей, только для родителей. Следовательно, это должно быть сделано в подходе централизованного репозитория событий, как это обычно делают фреймворки.

Это действительно одна из проблем, решаемых путем внедрения зависимостей, обнаруживаемых в некоторых фреймворках как роботолеги.

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

Если я понимаю вопрос:

как я могу отправить событие в основное приложение и иметь компонент во всплывающем менеджере для реагирования на это событие

Внутриваш всплывающий компонент, вы можете сделать что-то вроде этого:

var app:Application = FlexGlobals.topLevelApplication as Application;
app.addEventListener('myCustomEvent',onMyCustomEvent);

Теперь любые экземпляры myCustomEvent, отправляемые основным классом Application, будут запускать обработчик во всплывающем окне.Кроме того, любой экземпляр myCustomEvent, который всплывает до основного класса Application, запускает обработчик во всплывающем окне.

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

Если бы вы пытались задать другой вопрос;мне непонятно из твоего поста, который меня смутил.

...