动作中的[Bindable]意味着什么?

时间:2010-10-18 13:18:23

标签: actionscript

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

有谁知道?

3 个答案:

答案 0 :(得分:68)

[Bindable] 是您可以在Flex ActionScript代码中使用的多个元标记之一。它可以应用于在任何范围内标记的属性或方法。它不能与静态类成员一起使用。

使用 [Bindable] 元标记的关键是了解使用它时发生了什么。基本上使用数据绑定是一种添加事件侦听器和调度事件的简写。

[Bindable] 标记有两种基本形式。第一个是 [Bindable] ,后跟var / property声明。第二个是 [Bindable(event =&#34; eventname&#34;)] ,后跟var / property声明,函数/方法声明或getter / setter声明的一半。< / p>

我会首先解释较长的符号,因为另一个符号构建在相同的概念上,但速度更快。

当你使用 [Bindable(event =&#34; eventname&#34;)] 时,你实际上是在告诉编译器这个var / property / function /方法(把它称为实例成员)是可用的&#39;用作数据绑定的源。您还告诉它,当实例成员的值已经失效/更改并且需要重新读取&#34; eventname&#34;活动将被派遣 在这个更长的形式中,这就是你所做的一切。开发人员负责实际调度&#34; eventname&#34;每当需要在绑定订阅者中更新值时发生事件。

使用数据绑定的真正效率来自订阅方。您将在MXML中看到的典型符号是 value =&#34; {instance.propertyName}&#34; 当您使用符号 {} 时,您告诉编译器做以下事情:

  1. 创建一个侦听可绑定元标记中指定的事件的事件侦听器
  2. 在该事件中,侦听器重新读取instance.propertyName并更新此值
  3. 如果使用较短的形式 [Bindable] ,并且在属性/ var之前添加标记,则编译器会填充空白并添加一些其他功能以使属性可绑定。基本上你是告诉编译器&#34;添加使这个属性可绑定所需的事件和方法&#34;
    现在想一想编译器将在底层做什么的方法是这样的。

    1. 制作var
    2. 的私有版本
    3. 创建一个&#34;事件&#34;触发绑定
    4. 使用原始var的范围和名称创建一个getter函数,该函数在调用时返回var的私有版本。
    5. 使用原始var的范围和名称创建一个setter函数,该函数在调用AND时调用var的私有版本并调度触发事件。
    6. 本质上,编译器将为您完成大部分工作。

          [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. 无法在没有触发数据绑定的情况下更新基础值
      3. 第二个例子还演示了 [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类。

答案 1 :(得分:3)

它用于Flex的数据绑定,你可以在这里阅读更多相关信息

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

  

创建用作数据绑定源的属性

     

当您创建属性时   想用作数据的来源   绑定表达式,Flex可以   自动复制的值   源属性到任何目的地   属性时的source属性   变化。发信号给Flex执行   副本,你必须使用[Bindable]   用于注册属性的数据标记   弯曲。

答案 2 :(得分:1)

作为Justin所说的补充,您实际上可以使用两种方式在Flex中使用 @ 字符进行数据绑定。这是一个例子:

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

对于启用了源代码的工作示例,您可以查看我之前写过的这篇文章:

Two-ways data binding in Flex