Взаимодействие на основе событий между двумя пользовательскими классами

StackOverflow https://stackoverflow.com/questions/2905114

  •  04-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Любая помощь будет очень оценена :)

Это было полезно?

Решение

В большинстве случаев либо цель, либо 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.

------- Контейнер2.

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

Ваш код отправки в контейнере2 будет что-то вроде этого:

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

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

container2.addEventListener('myCustomEvent', onMyCustomEvent);

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top