Flex this
為了便于對比和敘述,我們先上一段最簡單的js+html代碼:
<input type="button" value="test" id="htmBtn" οnclick="alert(this.id)">
用慣js+html的程序員都知道,這里的this指向觸發事件的html組件本身,所以this.id將如愿顯示為”htmBtn”。
但是在flex3中,你寫事件偵聽函數時,this關鍵字將指向application,而不再指向觸發事件本身的組件上了(與js+html完全不同):
例如:
<mx:ComboBox name="ttt"? change="Alert.show('you have change the data!'+this.selectedLabel)">
<mx:dataProvider>
<mx:String>Dogs</mx:String>
<mx:String>Cats</mx:String>
<mx:String>Mice</mx:String>
</mx:dataProvider>
</mx:ComboBox>
中的this.selectedLabel將找不到任何東東。因為this并沒有指向這個combobox!!!
那么怎么找到觸發事件的組件呢?flex提供了event.currentTarget來指定觸發事件的當前組件,如下方式:
<mx:ComboBox name="ttt"? change="Alert.show('you have change the data!'+event.currentTarget.selectedLabel)">
<mx:dataProvider>
<mx:String>Dogs</mx:String>
<mx:String>Cats</mx:String>
<mx:String>Mice</mx:String>
</mx:dataProvider>
</mx:ComboBox>?
或者:<mx:Script><![CDATA[
private function changeEvt(e:Event):void {
Alert.show('you have change the data!'+e.currentTarget.selectedLabel)"
}
]]></mx:Script>
<mx:ComboBox name="ttt"? change="changeEvt(event)"><mx:dataProvider>
<mx:String>Dogs</mx:String>
<mx:String>Cats</mx:String>
<mx:String>Mice</mx:String>
</mx:dataProvider>
</mx:ComboBox>
官方文檔還提出了特別說明,使用event.currentTarget時有一個好習慣可以參考,即,最好先指定好該組件的類型,例如 TextInput(e.currentTarget),這樣做的目的是防止由于該組件某個屬性不存在時,編譯時不報錯而運行時才報錯,看代碼就明白了:
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
import mx.core.UIComponent;
private function tiHandler(e:Event):void {
/*?
這段代碼將會在運行時報錯,而編譯時不報錯。因為TextInput根本沒有tmesis屬性
e.currentTarget.tmesis = 4;
*/
/*
這段代碼的用法,就能在編譯時便發現錯誤,不用等到運行時才報錯
TextInput(e.currentTarget).tmesis = 4;
*/
}
]]></mx:Script>
<mx:TextInput id="ti1" click="tiHandler(event)"
text="This is some text. When you click on this control, the first three characters
are selected."/>
</mx:Application>
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: 成都大金中央空调售后服务电话是多少?
- 下一篇: Request.Url.Port 获取不