首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

Flex Data Binding详解(上)

2012-10-12 
Flex Data Binding详解(下)接着上一篇继续讲:? 数据绑定除了用[Bindable]标签来申明以外,也可以用mx:Bind

Flex Data Binding详解(下)

接着上一篇继续讲:

? 数据绑定除了用[Bindable]标签来申明以外,也可以用<mx:Binding/>组件和ActionScript实现。? 用<mx:Binding/>,例如:? <mx:binding source="text1.text" destination="text2.text"/>? <mx:binging source="text2.text" destination="text1.text"/>? <mx:TextInput id="text1"/>? <mx:TextInput id="text2"/>? source为绑定源,destination为目的源,按上面的写法,不论是text1还是text2发生变化,都会引起对方的变化。细心的你也许会想这不会引起死循环吗?答案是否定的,不会引起死循环。我想应该是Flex内部的机制已经优化了这种情况,让其只触发一次。? 用ActionScript来绑定:??1.使用bindProperty()。???bindProperty(site:Object, prop:String,host:Object, chain:Object,commitOnly:Boolean = false):ChangeWatcher,例如:?? var myc:ChangeWatcher=BindingUtils.bindProperty(text2,"text",text1,"text");?? 即当text1的值发生变化时text2也跟着变,site为目的对象,prop为目的属性,host为绑定源,china为绑定源属性链——关于属性链下面再讲,commitOnly默认为False,即不管是确认事件还是未确认事件都将触发绑定,而为True时,只有确认事件才能触发绑定,这个一般用不到,和Flex自身的事件机制有关,如果为false的话,当数据改变时将触发两次绑定事件,当为True时,只触发一次,自己可以用bindSetter方法来做测试。当不想绑定时可以用myc.unwatch()方法来解除绑定。??? 2.使用bindSetter()。? bindSetter(setter:Function, host:Object,?chain:Object,commitOnly:Boolean = false):ChangeWatcher,例如:? var myc:ChangeWatcher=BindingUtils.bindSetter(change,text1,"text",true);? private function change(str:String):void
???{
???text2.text=str;??? }? change就是当绑定源发生变化时所触发的函数,其他参数都一样。? 3.使用ChangeWatcher.watch()。? 同样可以用ChangeWatcher.watch方法来监控对象属性的变化,非常有用。? watch(host:Object, chain:Object,handler:Function,commitOnly:Boolean = false):ChangeWatcher,例如:? var myc:ChangeWatcher=ChangeWatcher.watch(text1,"text",change);? private function change(e:Event):void
???{
???text2.text=text1.text;??? }? 这里的Event和绑定数据所定义的触发事件有关,你可以用所有事件的父类Event来表示。???注意:?as主要是通过mx.binding.utils.BindingUtils 这个类来实现数据绑定,用MXML和as实现数据绑定有以下几点不同:? 1.当使用AS做数据绑定时,bindProperty()或?bindSetter()方法中不能使用AS代码,这和MXML是不同的,?可以用bindSetter()?方法来申明一个绑定处理函数。? 2.当使用AS做数据绑定时,同样不能使用EX4语法,也就是说不能直接使用XML解析语法了。? 3.当使用AS做数据绑定时,在属性链中不能使用任何函数和数组。? 4.MXML具有更好的错误提示和警告功能。? 最后来讲讲属性链。? 属性链就是bindProperty()和?bindSettet()等方法中的chain参数所表示的对象,? 有时也许绑定源并不只是text1.text这样的简单形式,也可以是类似于user.name.text1.text,那么就存在一个关系链的问题,如果这条链中的某一项发生了改变,会不会触发绑定呢?答案是如果你想让其改变其中的某一项都能触发数据绑定,那么这条链的每个元素必须是可绑定的。对于上面的这种形式,可以这样使用bindProperty方法:? bindProperty(text2, "text", this, ["user", "name","text1","text"])。? 就这么多吧,主要还是靠自己研究,希望对你有所帮助
原文地址:

czx33859066

?

热点排行