Как работает привязка в ActionScript? - PullRequest
12 голосов
/ 26 ноября 2008

Насколько я понимаю, привязка к переменной в ActionScript осуществляется через события, которые автоматически запускаются при изменении переменной. У меня есть несколько вопросов по этому поводу:

  1. Что произойдет, если класс явно не расширяет EventDispatcher? Есть ли какая-то магия, которая происходит в компиляторе, который по существу делает класс EventDispatcher?
  2. Как работает привязка к статическим переменным? Добавлена ​​ли какая-то неявная статическая функция addEventListener () в класс?
  3. Я заметил, что вы можете поставить [Bindable] на статические переменные, но не на статические функции, почему это так?

Edit:

Спасибо Кристофу Херреману за его яркий ответ. Тем не менее, у меня есть несколько дополнений из моих вопросов выше. Интересно, может ли кто-нибудь заполнить пробелы для меня (я пытался нумеровать эти вопросы 4, 5, 6, но они почему-то показываются 1, 2, 3!)

  1. Я добавил опцию -keep в компилятор и посмотрел на сгенерированный код привязки. Кто-нибудь может объяснить, как применяется этот код? Компилятор, кажется, генерирует класс с именем BindableProperty для каждого класса, который содержит метод получения и установки. Как это складывается в класс, который я написал? Эта функция выглядит как частичные классы в C # - это исключительно закулисная функциональность компилятора, или это то, что я мог бы использовать сам?

  2. Класс BindableProperty по-прежнему явно не реализует EventDispatcher. Как сгенерированный класс реализует диспетчеризацию событий?

  3. В вопросе 3 я спрашивал о привязке к статическим функциям, но на самом деле я имел в виду статические функции получения и установки. Это не разрешено.

1 Ответ

14 голосов
/ 26 ноября 2008
Привязки

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

Я постараюсь ответить на ваши вопросы.

  1. компилятор выберет тег метаданных [Bindable] и создаст получатель и установщик для каждого свойства, помеченного как связываемое. Получатель просто вернет значение свойства. Установщик проверит, отличается ли новое значение от исходного значения, и отправит событие PropertyChange, если это произойдет.

  2. То же самое, что и для свойств экземпляра в основном, только теперь создаются статический геттер и сеттер. Кроме того, создается mx.binding.StaticPropertyWatcher для отслеживания изменений в статических свойствах.

  3. при привязке к статическому методу вы получаете следующее предупреждение: «[Bindable] требует параметр имени события при применении к функции, которая не является получателем или установщиком». Описание в значительной степени говорит обо всем. Поскольку у вас нет события «propertyChange», которое запускается специально для этого метода, вы должны отправить собственное событие самостоятельно. Это [Bindable (event = "customEvent")], а затем отправить это событие из вашего класса.

...