`
keren
  • 浏览: 1556499 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex 数据绑定问题(单向 双向)

    博客分类:
  • Flex
阅读更多
注意:双向绑定要看好数据源和目标值,因为目标值改变会使得数据源的值改变.现在举例:
TextInput  和  ObjectProxy ={a:1}
case1: (目标)textInput 值改变了,(源)ObjectProxy跟着变:
        方法1:BindingUtils.bindProperty(txt_1, "text", obj, "a"); //设置绑定
       方法2:<mx:TextInput id="txt_1" text="{obj.a}"/>
case2: (目标)ObjectProxy 值改变了,(源)textinput跟着变:
        方法:必须写个 方法,用来改变 ObjectProxy的值.
        
        [Bindable]
        public function setValA(a:String):void{
	 obj.a=a;
        }
        

        然后用:
       
BindingUtils.bindSetter setValA,textinput,"text");


至此,双向绑定就可以了。

        9.2.1 函数和类级别的绑定
[Bindable]标签打使用:

变量级别的绑定,[Bindabl(event="propChange")]  如果自己指定事件,必须自己写代码派发事件,否则不会触发绑定行为。
在函数前定义,必须是通过setter和getter方式定义,必须写在set前面。Num相当于属性:
[Bindable]
public function set Num(n:Number):void{...}
public function get Num():void{...}

在一个公有类的定义前使用,这样这个类的所有公有变量,set、get方式定义的函数,都可以用于绑定,这就是对象级别的绑定。



9.2.2 使用ActionScript 来定义绑定


BindingUtils 位于mx.binding.utils 包中:

bindProperty(  用来进行属性级别的绑定

  site:Object,  表示目标对象
  prop:String,  目标对象的公有属性名,当值发生变化时,派发绑定事件
  host:Object,   数据源对象
  chain:Object,  数据源对象被绑定的属性名,或通过getter定义的函数名
  commitOnly:Boolean=false  默认false,表示要发生值的到改变时就会引发绑定行为。true:表示对对象有写操作时仍然会派发事件,但不会激发绑定行为,只有确认了改变的数据,并派发事件valueCommit 后,绑定动作才开始执行。
)

bindSetter(  专门用于setter 和 getter 函数的绑定

  setter:Function,  函数,用来改变数据源对象的值,可以直接在代码中声明一个函数体
  host:Object,  数据源对象
  chain:Object,  数据源对象被绑定的属性名,或通过getter定义的函数名
  CommitOnly:Boolean=false  默认false。同上。
)


ChangeWatcher 对象 位于mx.binding.utils 包中,侦听绑定的动作:
var cw:ChangeWatcher = ChangeWatcher.watch(tip_txt, "text", handler);
cw.unwatch(); //停止监听
watch(
  host:Object,  数据源对象
  chain:Object,  数据源对象被绑定的属性名,或通过get定义的函数
  handler:Function,  监听函数
  commitOnly:Boolean=false  默认false,表示只要发生值的改变时就会引发绑定行为,同上
)


9.2.3 数据绑定中的特例


在绑定中出现问题,一般有以下情况:

数据源没有被更改
绑定事件没有被派发出去
目标对象没有收到资源,也就无法更新

Object 类型作为所有类型的父类,它不完全支持数据绑定。
Object 类型属于动态类型,可以随意的向里面添加任何属性,而且属性的类型也是任意的。
如果要对Object类型绑定,必须使用 mx.utils 包中的 ObjectProxy 对象:
Xml代码
[Bindable]  
internal var info:Object;  
internal var function ininApp():void{  
  //定义info 的属性值  
  info = new ObjectProxy();  
  info.label = "label";  
  BindingUtils.bindProperty(tip_txt, "text", info, "label"); //设置绑定  


[Bindable]
internal var info:Object;
internal var function ininApp():void{
  //定义info 的属性值
  info = new ObjectProxy();
  info.label = "label";
  BindingUtils.bindProperty(tip_txt, "text", info, "label"); //设置绑定
}

Proxy 是代理的意思,ObjectProxy 就相当于 Object 的代理人,提供了数据绑定的接口,任何属性发生变化时,都会派发事件。

ArrayCollection 是增强性的 Array,依然是用数组来存储数据,但支持多种排序、属性绑定等,适合用来处理复杂数据。
setItemAt(item:Object, index:int);  //将元素插入到数组指定的位置,如果存在则替换
数组类型的对象,其子元素是无法作为数据源绑定的。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics