Подтвердить что ты не робот

Что означает [Bindable] в actionscript?

[Bindable]
/**
* Display output of video device.
*/              
public var videoLocal : Video;

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

  • сделать приватную версию вашего var
  • создать "событие", чтобы вызвать привязку
  • создайте функцию getter с областью действия и именем вашего исходного var, который возвращает private verson var при вызове.
  • создать функцию setter с областью действия и именем исходного var, который устанавливает приватную версию var при вызове AND отправляет инициирующее событие.

По сути, компилятор сделает для вас большую часть работы.

    [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]. Это значит, что когда вы применяете его к паре getter/setter, определенной для одного и того же имени переменной, вам нужно применить ее только к одному или другому, это применимо к обоим. Обычно вы должны установить его на получателе.

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

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

        return myMetaDataObject;
    }

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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