Что означает [Bindable] в ActionScript? - PullRequest
23 голосов
/ 18 октября 2010
[Bindable]
/**
* Display output of video device.
*/              
public var videoLocal : Video;

Кто-нибудь знает?

Ответы [ 3 ]

68 голосов
/ 03 марта 2011

[Bindable] - это один из нескольких метатегов, которые вы можете использовать в гибком коде ActionScript.Его можно применять к свойствам или методам, которые отмечены в любой области.Его нельзя использовать со статическими членами класса.

Ключом к использованию метатега [Bindable] является понимание того, что происходит под капотом при его использовании.По сути, использование привязки данных - это тип сокращения для добавления прослушивателей событий и диспетчеризации событий.

Существует две основные формы тега [Bindable] .Первый - это просто [Bindable] , за которым следует объявление var / property.Вторым является [Bindable (event = "имя-события")] * , за которым следует либо объявление var / property, объявление функции / метода, либо половина объявления getter / setter.

IСначала мы объясним более длинную нотацию, так как другие основаны на той же концепции, но с еще большим сокращением.

Когда вы используете [Bindable (event = "имя-события")] , по сути, вы говоритекомпилятор, который этот var / property / function / method (назовите это членом экземпляра) «доступен» для использования в качестве источника для привязки данных.Вы также говорите ему, что, когда значение элемента экземпляра было признано недействительным / изменено, и его необходимо перечитать, будет отправлено событие «имя-события».
В этой более длинной форме это все, что вы делаете.Вы, разработчик, несете ответственность за фактическую отправку события «имя события» всякий раз, когда необходимо обновить значение в подписчиках привязки.

Реальная эффективность использования привязки данных достигается на стороне подписки.Типичная нотация, которую вы увидите в MXML: value = "{instance.propertyName}" Когда вы используете нотацию {} , вы говорите компилятору сделать следующее:

  1. Создайте прослушиватель событий, который прослушивает событие, указанное в метатеге bindable
  2. В этом прослушивателе событий перечитайте instance.propertyName и обновите это значение

Если вы используете более короткую форму [Bindable] и добавляете тег перед свойством / var, компилятор заполняет пробелы и добавляет некоторые дополнительные функции, чтобы сделать свойство привязываемым.По сути, вы говорите компилятору «добавить события и методы, необходимые для того, чтобы сделать это свойство привязываемым»
Теперь способ думать о том, что компилятор будет делать под капотом, таков.

  1. сделать приватную версию вашего var
  2. создать «событие» для запуска привязки
  3. создать функцию-получатель с областью действия и именем вашего исходного var, который возвращает приватный вариантпеременной var при вызове.
  4. создайте функцию-установщик с областью действия и именем вашего исходного 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"));
    }

Единственное функциональное отличие состоит в том, что в первом случае;

  1. вы не знаете именисобытие, которое будет отправлено для инициирования привязки
  2. , нет способа обновить базовое значение без , инициирующего привязку данных

Этот второй пример также демонстрируетодин особый случай метатега [Bindable] .Это то, что когда вы применяете его к паре получатель / установщик, определенной для того же имени переменной, вам нужно применить его только к одному или другому, оно будет применяться к обоим.Как правило, вы должны установить его на получателе.

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

    [Bindable(event="metaDataChanged")]
    [Bindable(event="metaObjectUpdated")]
    public function readMyMetaData():MetaDataObject{
        var myMetaDataObject:MetaDataObject;
            .
            .
            .

        return myMetaDataObject;
    }

Это предполагает, что где-то еще ваш класс отправит это событие metaDataChanged или событие metaObjectUpdated , когда вы захотите инициировать привязку.

Также обратите внимание, чтос помощью этой записи вы можете связать привязку любого члена экземпляра с любым событием, которое будет отправлено экземпляром.Даже унаследованные события, которые вы сами не генерируете, такие как FrameEnter, OnChange и т. Д. *

Привязки данных также можно настроить и уничтожить во время выполнения.Если вы заинтересованы в этом, взгляните на классы mx.binding.utils.

3 голосов
/ 18 октября 2010

Используется в связывании данных с Flex, подробнее об этом можно прочитать здесь

http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_2.html

Создание свойств для использования в качестве источника для привязки данных

Когда вы создаете свойство, которое вы хотите использовать в качестве источника данных выражение связывания, Flex может автоматически скопировать значение исходное свойство в любое место назначения свойство, когда свойство источника изменения. Чтобы дать сигнал Flex, чтобы выполнить копию, вы должны использовать [Bindable] тег данных для регистрации собственности Flex.

1 голос
/ 01 ноября 2013

В дополнение к тому, что сказал Джастин, вы можете использовать два способа привязки данных во Flex с символом @ . Вот пример:

<s:TextInput id="txt1" text="@{txt2.text}" />

Для рабочего примера с включенным исходным кодом вы можете проверить эту статью, которую я написал некоторое время назад:

Двустороннее связывание данных в Flex

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