Как работает привязка в ActionScript?
Насколько я понимаю, привязка к var в ActionScript выполняется через события, которые автоматически запускаются при изменении var. У меня есть несколько вопросов по этому поводу:
- Что произойдет, если класс явно не расширяет EventDispatcher? Существует ли какая-то магия в компиляторе, которая по существу делает класс EventDispatcher?
- Как работает привязка к статическим варам? Является ли какая-то неявная статическая функция addEventListener(), добавленная в класс?
- Я заметил, что вы можете поставить [Bindable] на статические vars, но не статические функции, почему это?
Edit:
Спасибо Кристофу Герреману за его освещающий ответ. Тем не менее, у меня есть несколько последующих вопросов из моих вопросов выше. Интересно, может ли кто-нибудь заполнить пробелы для меня (я пытался указать эти вопросы 4, 5, 6, но они почему-то появляются по 1, 2, 3!)
-
Я добавил параметр -keep в компилятор и посмотрел на сгенерированный код привязки. Может ли кто-нибудь объяснить, как этот код применяется? Кажется, что компилятор создает класс BindableProperty для каждого класса, который содержит getter и setter. Как это складывается в класс, который я написал? Эта функция выглядит как частичные классы в С# - это эксклюзивная функция компилятора за кадром или я могу использовать ее самостоятельно?
-
Класс BindableProperty по-прежнему явно не реализует EventDispatcher, как генерируемый класс реализует диспетчеризацию событий?
-
В вопросе 3 я спросил о привязке к статическим функциям, но на самом деле я имел в виду статические функции getter и setter. Это, похоже, не разрешено.
Ответы
Ответ 1
привязки действительно работают через диспетчеризацию событий. Вы можете многому научиться из созданного кода ActionScript, добавив флаг -keep в настройки компилятора.
Я постараюсь ответить на ваши вопросы.
-
компилятор подберет тег метаданных [Bindable] и создаст геттер и сеттер для каждого свойства, которое вы отметили как связываемое. Получатель просто вернет значение свойства. Установщик проверяет, отличается ли новое значение от исходного значения и отправит событие PropertyChange, если это произойдет.
-
то же самое, что, например, свойства свойства, только теперь создается статический getter и setter. Кроме того, создается mx.binding.StaticPropertyWatcher для просмотра изменений в статических свойствах.
-
При привязке к статическому методу вы получаете следующее предупреждение: "[Bindable] требует параметра имени события при применении к функции, которая не является получателем или сеттер". Описание в значительной степени говорит все. Поскольку у вас нет события "propertyChange", которое запускается специально для этого метода, вам нужно отправить свой заказ самостоятельно. Это [Bindable (event = "customEvent" )], а затем отправляет это событие откуда-то из вашего класса.