深入分析Flex [Bindable](转)

      使用数据绑定时,Flex 会自动把一个对象的数据复制,提供给另一个对象使用,提供数据一方称为数据源对象,使用数据的一方称为目标对象。当数据源对象的数据发生变化时,目标对象的数据会自动更新。

      实质上,绑定的实现也是借助事件机制来完成的,当目标使用了数据绑定,目标对象就会侦听数据源的某一个固定事件。如果数据源改变,就派发事件,通知目标对象更新最新数据。当然这个过程都是由Flex来完成。

      作为绑定的数据源对象,必须支持绑定--对象有派发改变事件的能力。

      使用数据绑定的多数情况:

      1、将后台数据(通过Web Service 或 Remoting 方式得到的数据)绑定给控件

      2、把控件数据绑定给后台通信对象,发送给后台服务端

      3、后台返回数据和数据模型 进行绑定

      4、组件或对象属性的数据绑定

      绑定方式

      将数据源对象房子大括号{}中,作为目标对象的值就可以了。

          backgroundColor="{mColor.value.toString()}"
      在{}中也可以使用AS:
          text="{(Number(age_txt.text)>= 16)?'成年':'未成年'}"

      也可以使用函数:
          scaleX="{doResize(scale)}" 

      使用[Bindable]来实现绑定功能,[Bindable]是元标签的一种,专门用来定义绑定中的数据源对象,event事件名指当前数据源发生变化时,数据源所在对象派发的事件类型,可选的,默认:propertyChange :
      [Bindable]
      [Bindabl(event="eventname")]
      比如我们定义scale:
      [Bindable]
      private var scale:Number = 1;

      使用<mx:Binding> 标签来定义数据绑定:
      <mx:Binding source="users.user.blogURL" destination="pic.toolTip" />
      其中source指定数据源,destination指定目标对象的属性,两者的数据类型必须相同

 

      举例:给下面的public变量加上[Bindable]

      [Bindable] 

      public var name:String = "";

 

      作为一个public变量,肯定既可以被赋值,也能赋值给别的变量。绑定的作用就是,当name改变的时候(被赋值了),可能通知其它被name影响(赋值给它们)的变量发生改变。这里的“可能”就需要编译器来判断,这就是为什么元数据是给编译器用的原因了。在mxml里用{}的语法的地方就是绑定的对象,比如label={xxx.name},当name变化,label也跟着变化。这样,我们只是很简单的改变了name的值,由于有绑定,界面上的label也跟着自动变化了。

      Bindable使用地方

      三个地方:类, 变量, getter/setter。是不是public没有关系,private的就只能给自家用呗。用在Class上就是简单的给所有的public属性(包括变量,getter/setter,普通方法)加上[Bindable],可是一般的方法不能用[Bindable],于是一般就能看到flex给了个warning,直接无视。变量就是上面讲的,很简单略掉。

      用在只读,只写属性(getter/setter)上面,因为getter和setter很像方法,用起来会有点不同。看看这个例子:

 

      [Bindable] 

      private var content:Array = new Array(); 

      [Bindable] 

      public function set _content(ct:String):void 

      { 

      content = ct.split(SEP); 

      } 

      [Bindable] 

      public function get _wholeText():String 

      { 

      if(content.length == 0) 

      { 

      return ""; 

      } 

      else 

      { 

      var _w:String = ""; 

      for(var i:int=0 ; i<content.length ; i++) 

      { 

      _w += content[i] + "\r\n"; 

      } 

      return _w; 

      } 

      }

      原来的设想是content绑定_wholeText,可它是不工作的。为什么?_wholeText太复杂了,被编译器排除在“可能”之外,编译器认为没有绑定关系,如果只是简单的return content,倒是可以的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值