亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Flex > 正文

Flex Data Binding詳解

2024-09-12 17:51:28
字體:
來源:轉載
供稿:網友
Data BindIng 什么時候發生:

1.在綁定源屬性值發生改變時發生。
2.在綁定源發出initialize事件時綁定發生一次。

讓屬性具有可綁定功能:

一般的,只要在屬性前加上
[Bindable] 或
[Bindable(event="eventname")]
元標記即可
注意:
如果沒有標出觸發綁定的事件,正如[Bindable],Flex會自動為綁定加上propertyChange事件,當源數據發生變化時,Flex將自動派發該事件,觸發數據綁定。如果修改后數據和源數據“===”也就是全等,那么Flex將不會觸發數據綁定。
如果標出的觸發綁定的事件,正如[Bindable(event="eventname")],那么在源數據發生改變的時候,必須dispatch出該事件才能觸發數據綁定。不論修改后數據和源數據是否全等,Flex都將會觸發數據綁定,需要自己編程控制,例如:
<mx:Script>
<![CDATA[
[Bindable(event="hhhh")]
private var ss:String="aaa";

private function doTest():void
{
ss="bbb";
if(ss!=="aaa") / /判斷和源數據是否相等,不相等則觸發綁定
this.dispatchEvent(new Event("hhhh"));
}
]]>
</mx:Script>
<mx:Text text="{ss}"/>
<mx:Button click="doTest()"/>
如果沒有this.dispatchEvent(new Event("hhhh"))這句,那么你點擊按鈕是沒有設么作用的。 另外當申明自定義觸發事件時,用ChangeWatcher來監控其變化,發現雖然目的源值變了,但是ChangeWatcher卻監控不到變化,同樣ChangeWatcher也監控不到非共有變量的變化。關于ChangeWatcher,下面會提到。
綁定函數――Functions,對象――Object,數組――Arrays
函數:
你可以在{}中直接使用函數。例如:<mx:Text text="{Matn.random()*ss}"/>
上面這個沒有什么好講的,關于函數綁定下面這個比較重要:
<mx:Script>
<![CDATA[
public var ss:String="aaa";

[Bindable(event="hhhh")]
private function gg():String
{
return ss;
}

private function doTest():void
{
ss=Math.random().toString();
this.dispatchEvent(new Event("hhhh"));
}
]]>
</mx:Script>

<mx:Text text="{gg()}"/>
<mx:Button click="doTest()"/>
這樣給函數加一個[bindable],便使函數具有綁定功能,但是如果不申明自定義觸發事件,只能在組件初始化時綁定一次,點擊以上按鈕是沒有什么作用的。大家可以自己試試。

還有getter和setter函數,比較重要,給getter或setter函數加上[bindable],用不著兩個都加,加一個就可以了,例如:
<mx:Script>
<![CDATA[
public var ss:String="aaa";

[Bindable]
public function get gg():String
{
return ss;
}

public function set gg(value:String):void
{
ss=value;
}

private function doTest():void
{
gg=Math.random().toString();
this.dispatchEvent(new Event("hhhh"));
}
]]>
</mx:Script>

<mx:Text text="{gg}"/>
<mx:Button click="doTest()"/>
同樣能達到綁定效果,如果只有一個getter方法,那么要想實現數據綁定,就需要申明自定義觸發事件了,大家可以自己試試。
對象:
對象綁定最重要的是搞清楚怎么申明才能使其屬性具有綁定功能,例如:
申明對象 NonBindableObject
//[bindable] 先注釋掉這行,測試
public class NonBindableObject extends Object
{

public function NonBindableObject() {
super();
}

public var stringProp:String = "String property";

public var intProp:int = 52;
}
綁定
<mx:Script>
<![CDATA[
[Bindable]
public var myObj:NonBindableObject = new NonBindableObject();
[Bindable]
public var anotherObj:NonBindableObject =
new NonBindableObject();
public function initObj():void {
anotherObj.stringProp = 'anotherObject';
anotherObj.intProp = 8;
}
]]>
</mx:Script>
<mx:Text id="text1" text="{myObj.stringProp}"/>
<mx:Text id="text2" text="{myObj.intProp}"/>
<mx:Button label="改變 myObj.stringProp"
click="myObj.stringProp = 'new string';"/>

<mx:Button label="改變 myObj.intProp"
click="myObj.intProp = 10;"/>

<mx:Button label="Change myObj"
click="myObj = anotherObj;"/>
如果在申明對象時沒有在類前加上[bindable]標簽,那么該對象的所有屬性是不能被綁定的,也就是說當對象屬性發生變化時,不會觸發綁定,所以點擊前兩個按鈕都是沒有用的,只有當該對象本身發生變化時,才能夠觸發綁定,正如第三個按鈕的操作。
現在取消第一行的注釋,使對象屬性可綁定,那么再點前兩個按鈕試試。只要給對象加上[Bindable]元標記,那么會使該對象的所有公有屬性――public和擁有getter和setter方法的屬性具有綁定功能。
數組:
如果把數組作為綁定對象,那么最好使用ArrayCollection對象,因為當使用ArrayCollection對象的一些API來操作數組會觸發數據綁定,如:ArrayCollection.addItem(), ArrayCollection.addItemAt(), ArrayCollection.removeItem(), and ArrayCollection.removeItemAt()方法 ,不然要直接使用Array的話,只用當Array本身發生變化時才觸發數據綁定,當數組中某一屬性發生變化時是不會觸發數據綁定的。例如:
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
public var myAC:Array =["One", "Two", "Three", "Four"];

[Bindable]
public var myAC2:Array =["One1", "Two1", "Three1", "Four1"];
]]>
</mx:Script>
<mx:Text id="text1" text="{myAC[0]}"/>
<mx:Text id="text2" text="{myAC.getItemAt(0)}"/>
<mx:Button id="button1"
label="改變某一屬性"
click="myAC[0]='new One'"/>
<mx:Button id="button2"
label="改變對象"
click="myAC=myAC2"/>
當使用[]形式來申明數組時,必須使用ArrayCollection的API方法來實現數據綁定,所以當你點擊第一個按鈕時,text2發生了改變,而text1沒有。
數據綁定除了用[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"])。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久国产色av| 大胆欧美人体视频| 国产精品扒开腿做| 亚洲精品一区二区久| 欧美大片大片在线播放| 日韩成人xxxx| 久久久久女教师免费一区| 青草青草久热精品视频在线观看| 97视频免费在线看| 精品国产成人在线| 日本91av在线播放| 亚洲自拍高清视频网站| 欧美成人精品在线视频| 岛国视频午夜一区免费在线观看| 欧美激情在线观看视频| 日韩黄色在线免费观看| 成人国产亚洲精品a区天堂华泰| 久久亚洲精品一区二区| 91免费国产视频| 欧美激情手机在线视频| 亚洲一区999| 国产精品日韩av| 国产精品日本精品| 国产精品av在线| 69精品小视频| 欧美洲成人男女午夜视频| 亚洲国产精品小视频| 欧美性视频网站| 国产精品女主播| 亚洲天堂第一页| 日韩美女毛茸茸| 欧美视频在线免费看| 狠狠操狠狠色综合网| 成人在线观看视频网站| 国产精品视频区1| 亚洲福利在线视频| 自拍亚洲一区欧美另类| 久久99久久99精品中文字幕| 日韩欧美第一页| 久热精品视频在线免费观看| 日韩专区在线观看| 成人国产精品免费视频| 韩国精品久久久999| 成人在线播放av| 福利视频一区二区| 97免费中文视频在线观看| 亚洲性夜色噜噜噜7777| 亚洲欧美日韩爽爽影院| 成人精品福利视频| 在线精品高清中文字幕| 日韩av免费在线观看| 亚洲xxxx视频| 国产一区二区欧美日韩| 91精品国产网站| 不卡av电影在线观看| 日韩风俗一区 二区| 国产精品96久久久久久又黄又硬| 中文.日本.精品| 精品国产精品自拍| 亚洲mm色国产网站| 4438全国亚洲精品在线观看视频| 丝袜美腿亚洲一区二区| 98精品国产自产在线观看| 国产日韩在线看片| 国产精品欧美日韩| 亚洲欧洲国产一区| 国产视频久久久久久久| 日韩视频中文字幕| 国产成人精品在线| 日产日韩在线亚洲欧美| 日韩欧美精品网站| 国产精品v片在线观看不卡| 另类图片亚洲另类| 欧美精品成人在线| 欧美午夜片在线免费观看| 亚洲第一中文字幕| 日韩在线欧美在线| 久久久天堂国产精品女人| 亚洲免费视频在线观看| 日韩精品中文字幕久久臀| 国产成人涩涩涩视频在线观看| 成人福利视频在线观看| 久久99视频精品| 亚洲综合精品伊人久久| 亚洲国产一区自拍| 国产成人精品日本亚洲| 欧洲亚洲妇女av| 亚洲欧美中文日韩v在线观看| 中文国产成人精品久久一| 亚洲国产一区二区三区在线观看| 日韩av在线播放资源| xxxxx成人.com| 欧美自拍视频在线观看| 欧美日韩在线另类| 91日韩在线播放| 亚洲欧美国产精品久久久久久久| 国产精品久久久久久搜索| 欧美成人免费播放| 91亚洲精品视频| 日韩黄色av网站| 成人免费视频在线观看超级碰| 国产精品wwwwww| 欧美黑人极品猛少妇色xxxxx| 国产精品第三页| 中国日韩欧美久久久久久久久| 韩曰欧美视频免费观看| 久久这里只有精品99| 亚洲天堂av综合网| 亚洲最大福利视频| 欧美日韩在线视频观看| 久久精彩免费视频| 国产精品精品一区二区三区午夜版| 中文字幕日韩精品在线观看| 91在线网站视频| 亚洲美女福利视频网站| 亚洲成年人影院在线| 亚洲女人被黑人巨大进入al| 国产日韩欧美在线| 色综合伊人色综合网| 亚洲精品成人久久| 国产精品h片在线播放| 欧洲日本亚洲国产区| 不卡中文字幕av| 亚洲精品美女久久久久| 91久久久久久久久久久| 精品国产精品自拍| 国内外成人免费激情在线视频| 免费91麻豆精品国产自产在线观看| 夜夜嗨av一区二区三区免费区| 岛国视频午夜一区免费在线观看| 91欧美日韩一区| 日韩av免费在线观看| 日本精品视频在线观看| 欧美高清理论片| 国产日韩欧美在线视频观看| 亚洲高清久久网| 久久久久久成人精品| 成人av.网址在线网站| 成人免费福利视频| 2020国产精品视频| 欧美成人黑人xx视频免费观看| 69久久夜色精品国产7777| 亚洲欧美国产精品久久久久久久| 国产成人福利网站| 精品国产自在精品国产浪潮| 成人黄色生活片| 国产精品国产三级国产aⅴ浪潮| 国产最新精品视频| 欧美激情按摩在线| 高清欧美性猛交| 午夜精品理论片| 一区二区三区日韩在线| 欧美极品少妇全裸体| 欧美激情视频播放| 青青草国产精品一区二区| 国产一区玩具在线观看| 国产精品高清在线| 亚洲福利在线视频| 日韩在线观看免费全| 成人免费视频xnxx.com| 亚洲第一免费网站| 国产精品免费一区| 亚洲缚视频在线观看| 久久精品国产清自在天天线|