关于Flex-BindingUtils的用法介绍
说到Flex的数据绑定,不得不提到[Bindable]和BindingUtils,两者都是基于Flex的事件机制,前者的用法请参考我的另一篇文章http://www.voidcn.com/article/p-vqferomu-bdr.html,现在我们重点来探讨下BindingUtils的用法,其实刚开始用BindingUtils这个类的时候,是用在两个不同的组件之间的属性绑定,没有仔细去探究过其原理。然而当用到自定义类的属性绑定的时候就出现了绑定失效的问题,那么原因在哪呢? 首先我们来看看BindingUtils的源码 ? public static function bindProperty( ?????????????????????????????prop:String,//在要绑定的 site 对象中定义的公用属性(可以是public属性名或者public setter函数的函数名)。 ???????????????????????????????????????? 当 chain 值更改时,该属性将接收 chain 的当前值?。 ?????????????????????????????host:Object,//用于承载要监视的属性或属性链的对象 ?????????????????????????????chain:Object,//要监视的属性(可以是public属性名或者public setter函数的函数名)或属性链的值 ?????????????????????????????commitOnly:Boolean = false //如果仅在提交 change 事件时需要调用处理函数,则设置为 true,否则设置为false ?????????????????????????????):ChangeWatcher //如果已为 chain 参数指定了至少一个属性名称,则返回 ChangeWatcher 实例;否则返回 null ? ? public static function bindSetter(setter:Function,//chain的当前值改变时使用改值的参数进行调用的Setter方法 ???????????????????????????host:Object,//用于承载要监视的属性或属性链的对象 ???????????????????????????):ChangeWatcher //如果已为 chain 参数指定了至少一个属性名称,则返回 ChangeWatcher 实例;否则返回 null ????????????}; ? ? 根据源码我们能看到实现绑定的对象为ChageWatcher,它相当于一个监视者,ChageWatcher调用静态watch函数时所做的事有: ???1.获得ChangeWatcher实例,ChangeWatcher实例可以是对单个属性或者属性链的监视,如果是属性链,则该监视第一层属性的ChangeWatcher会包含监视下一层属性的ChangeWatcher的引用,依次往下类推。 ???2.调用ChangeWatcher实例的reset方法,reset所做的事有(可参考ChangeWatcher源码,此处不再粘贴) ??????(1).获得chain的所有change事件(PropertyChangeEvent)(因为要派发PropertyChangeEvent事件,chain属性或setter方法必须用[Bindable]声明) ??????(2).依次为host添加监听器,监听chain的change事件(因为要添加监听器,故host对象必须实现IEventDispatcher接口) ??????(3).如果ChangeWatcher实例包含对下一层属性ChangeWatcher实例的引用,则调用下一层属性ChangeWatcher实例的reset方法 ???3.返回监视第一层属性的ChangeWatcher ? ? 上面说到为host添加监听器监听chain的change事件,下面我们来看看监听器的事件处理器函数: ??????2.调用handler函数处理最终结果,hander函数为ChangeWatcher实例setHandler函数所设置的function(setHandler时会为每一层属性的ChangeWatcher实例设置处理函数) ? ? 下面我们总结下要实现绑定需要满足什么条件 host???1.host对象必须继承IEventDispatcher接口 ?????? 2.chain? public属性或public? setter方法必须用[Bindable]声明,或者在整个类声明上添加[Bindable]声明 ? site? ? 调用bindProperty函数时,prop 必须为public属性或public? setter方法 ? setter? 调用bindSetter函数时,setter方法名可以为任意,但参数必须为chain的value类型 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |