Основанное на событиях взаимодействие между двумя пользовательскими классами - PullRequest
0 голосов
/ 25 мая 2010

У меня такая проблема: У меня есть 2 пользовательских компонента, которые имеют свою собственную иерархию вложений ... Один является контейнером для другого. Я должен "познакомить их" друг с другом. Я пытаюсь добиться этого, используя глобальные события (одна сторона стреляет, а другая ловит):

Application.application.addEventListener("Hello", function (data:Event):void{
        // .. some actions
    });

//and
Application.application.dispatchEvent(new Event(Hello));

Все довольно хорошо, но есть одна вещь ... когда я пытаюсь поймать событие, я не могу попасть в класс, который его ловит. E.g.:

  1. Контейнер запускает событие.
  2. Ребенок ловит его.
  3. Затем должно быть создано соединение между контейнером и его дочерним элементом.

НО, единственное, что я смог достичь, это передать ссылку на контейнер в DynamicEvent. Есть ли шанс, что я смогу получить доступ к потомку в функции обработчика событий. Или, может быть, есть более элегантный способ решить эту проблему ...

Любая помощь будет принята с благодарностью:)

Ответы [ 3 ]

1 голос
/ 25 мая 2010

В большинстве случаев, target или currentTarget предоставят вам доступ к компоненту, который запускает событие.

http://livedocs.adobe.com/flex/3/langref/flash/events/Event.html http://livedocs.adobe.com/flex/3/langref/flash/events/Event.html#currentTarget http://livedocs.adobe.com/flex/3/langref/flash/events/Event.html#target

Однако при вашем подходе вы запускаете событие из приложения верхнего уровня; не от одного из ваших вложенных компонентов. Это кажется мне необычным.

Я предполагаю, что у вас есть такая иерархия:

Применение

--- Контейнер1

------- container2

Я бы порекомендовал запустить событие из container2 и прослушать его в container1.

Ваш код отправки в Container2 будет примерно таким:

this.dispatchEvent(new Event('myCustomEvent'));

В container1 вы можете прослушать событие примерно так:

container2.addEventListener('myCustomEvent', onMyCustomEvent);

Если вам нужно добавить пользовательские данные о событии; Вы можете создать свой собственный класс событий и добавить данные. У вас есть конкретный вариант использования для запуска событий из контейнера приложения? Я хотел бы услышать это.

0 голосов
/ 25 мая 2010

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

Mate имеет концепцию EventMap, которая позволяет отображать определенные события для взаимодействия с вашими представлениями различным образом. Вы можете вводить значения в свойства представления или вызывать методы в представлении, когда происходят определенные события.

Если вы не хотите использовать фреймворк, посмотрите на свойство bubbles в классе Event. При переопределении класса Event для создания настраиваемого события установите значение пузырьков по умолчанию на true . Таким образом, ваши события будут продолжать распространяться до основного приложения, независимо от того, насколько глубоко они вложены в ваше приложение.

0 голосов
/ 25 мая 2010

Мы сделали, как говорит Flextras, создали пользовательские события, в нашем случае события Cairngorm, и фактически добавили данные, ссылку на контейнер, на который вы хотите, чтобы отвечающий на событие отвечал. Мне не очень нравилось делать это таким образом, так как в очень редких случаях контейнер может не находиться в состоянии, с которым он может взаимодействовать. В нашем случае у нас есть много динамически загружаемых модулей, которые могут приходить и уходить, а затем WHAM! Внезапно вы получаете гибкий эквивалент исключения нулевого указателя. Но это цена, которую вы платите, когда вы сильно асинхронны, много нулевой проверки и отлова исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...