[Bindable] - это один из нескольких метатегов, которые вы можете использовать в гибком коде ActionScript.Его можно применять к свойствам или методам, которые отмечены в любой области.Его нельзя использовать со статическими членами класса.
Ключом к использованию метатега [Bindable] является понимание того, что происходит под капотом при его использовании.По сути, использование привязки данных - это тип сокращения для добавления прослушивателей событий и диспетчеризации событий.
Существует две основные формы тега [Bindable] .Первый - это просто [Bindable] , за которым следует объявление var / property.Вторым является [Bindable (event = "имя-события")] * , за которым следует либо объявление var / property, объявление функции / метода, либо половина объявления getter / setter.
IСначала мы объясним более длинную нотацию, так как другие основаны на той же концепции, но с еще большим сокращением.
Когда вы используете [Bindable (event = "имя-события")] , по сути, вы говоритекомпилятор, который этот var / property / function / method (назовите это членом экземпляра) «доступен» для использования в качестве источника для привязки данных.Вы также говорите ему, что, когда значение элемента экземпляра было признано недействительным / изменено, и его необходимо перечитать, будет отправлено событие «имя-события».
В этой более длинной форме это все, что вы делаете.Вы, разработчик, несете ответственность за фактическую отправку события «имя события» всякий раз, когда необходимо обновить значение в подписчиках привязки.
Реальная эффективность использования привязки данных достигается на стороне подписки.Типичная нотация, которую вы увидите в MXML: value = "{instance.propertyName}" Когда вы используете нотацию {} , вы говорите компилятору сделать следующее:
- Создайте прослушиватель событий, который прослушивает событие, указанное в метатеге bindable
- В этом прослушивателе событий перечитайте instance.propertyName и обновите это значение
Если вы используете более короткую форму [Bindable] и добавляете тег перед свойством / var, компилятор заполняет пробелы и добавляет некоторые дополнительные функции, чтобы сделать свойство привязываемым.По сути, вы говорите компилятору «добавить события и методы, необходимые для того, чтобы сделать это свойство привязываемым»
Теперь способ думать о том, что компилятор будет делать под капотом, таков.
- сделать приватную версию вашего var
- создать «событие» для запуска привязки
- создать функцию-получатель с областью действия и именем вашего исходного var, который возвращает приватный вариантпеременной var при вызове.
- создайте функцию-установщик с областью действия и именем вашего исходного var, который устанавливает частную версию var при вызове AND и отправляет инициирующее событие.
InПо сути, компилятор сделает большую часть работы за вас.
[Bindable]
public var xyz
эквивалентно
private var _xyz:String;
[Bindable(event="updateXYZValue")]
public function get xyz():String{
return _xyz;
}
public function set xyz(newxyz:String):void{
_xyz = newxyz;
dispatchEvent(new Event("updateXYZValue"));
}
Единственное функциональное отличие состоит в том, что в первом случае;
- вы не знаете именисобытие, которое будет отправлено для инициирования привязки
- , нет способа обновить базовое значение без , инициирующего привязку данных
Этот второй пример также демонстрируетодин особый случай метатега [Bindable] .Это то, что когда вы применяете его к паре получатель / установщик, определенной для того же имени переменной, вам нужно применить его только к одному или другому, оно будет применяться к обоим.Как правило, вы должны установить его на получателе.
Вы можете использовать любое обозначение для функции / метода, однако, если вы не укажете событие, привязка никогда не сработает, поэтому, если вы пытаетесь связать с функцией, которую выследует всегда указывать событие.Также возможно указать более одного запускающего события, сложив тег.например,
[Bindable(event="metaDataChanged")]
[Bindable(event="metaObjectUpdated")]
public function readMyMetaData():MetaDataObject{
var myMetaDataObject:MetaDataObject;
.
.
.
return myMetaDataObject;
}
Это предполагает, что где-то еще ваш класс отправит это событие metaDataChanged или событие metaObjectUpdated , когда вы захотите инициировать привязку.
Также обратите внимание, чтос помощью этой записи вы можете связать привязку любого члена экземпляра с любым событием, которое будет отправлено экземпляром.Даже унаследованные события, которые вы сами не генерируете, такие как FrameEnter, OnChange и т. Д. *
Привязки данных также можно настроить и уничтожить во время выполнения.Если вы заинтересованы в этом, взгляните на классы mx.binding.utils.