本文和大家重点讨论一下如何将对象用于Flex数据绑定,当使用对象进行工作时,不得不考虑什么时候定义到这个对象的绑定?或者考虑什么时候定义一个到这个对象属性的绑定?
将对象用于Flex数据绑定
当使用对象进行工作时,不得不考虑什么时候定义到这个对象的绑定?或者考虑什么时候定义一个到这个对象属性的绑定?
绑定到对象
当使一个对象成为Flex数据绑定表达式的源时,Flex数据绑定发生在这个对象被更新之时,或者这个对象的引用被更新之时,但不能发生在这个对象的单个(数据)域(feild)被更新之时。
下面的范例中,创建了Object类的子类,这个子类带有两个属性,stringProp和intProp,但没有使这两个属性成为可绑定属性:
- packagemyComponents
- {
- //binding/myComponents/NonBindableObject.as
- //Makenoclasspropertiesbindable.
- publicclassNonBindableObjectextendsObject{
- publicfunctionNonBindableObject(){
- super();
- }
- publicvarstringProp:String="Stringproperty";
- publicvarintProp:int=52;
- }
- }
因为这个类的两个属性不是可绑定属性,当它们被更新时Flex不会发出事件去触发Flex数据绑定。接下来在Flex应用中使用这个类,如下面的范例所示:
- <?xmlversionxmlversion="1.0"?>
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"
- creationComplete="initObj();">
- <![CDATA[
- importmyComponents.NonBindableObject;
- [Bindable]
- publicvarmyObj:NonBindableObject=newNonBindableObject();
- [Bindable]
- publicvaranotherObj:NonBindableObject=
- newNonBindableObject();
- publicfunctioninitObj():void{
- anotherObj.stringProp='anotherObject';
- anotherObj.intProp=8;
- }
- ]]>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj.stringProp"
- click="myObj.stringProp='newstring';"/>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj.intProp"
- click="myObj.intProp=10;"/>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj"
- click="myObj=anotherObj;"/>
因为没有使NonBindableObject类的单个数据域(fields)成为可绑定属性,所以应用在两个Text控件的绑定在应用启动时以及在myObj被更新时才会被更新。在编译这个应用时,编译器会输出警告信息,提示Flex数据绑定机制不能检测stringProp和intProp属性的变化。
绑定到对象的属性
为了使对象的属性可绑定,要创建新的类定义,如下面的范例所示:
- packagemyComponents
- {
- //binding/myComponents/BindableObject.as
- //Makeallclasspropertiesbindable.
- [Bindable]
- publicclassBindableObjectextendsObject{
- publicfunctionBindableObject(){
- super();
- }
- publicvarstringProp:String="Stringproperty";
- publicvarintProp:int=52;
- }
- }
通过在类定义之前放置[Bindable]元数据标记,就可以使得类中所有public变量、以及所有完全具备setter及getter的public属性成为可绑定的属性。接下来就可以使用stringProp和intProp属性作为Flex数据绑定的源,如下范例所示:
- <?xmlversionxmlversion="1.0"?>
- <mx:Applicationxmlns:mxmx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"
- creationComplete="initObj();">
- <![CDATA[
- importmyComponents.BindableObject;
- [Bindable]
- publicvarmyObj:BindableObject=newBindableObject();
- [Bindable]
- publicvaranotherObj:BindableObject=
- newBindableObject();
- publicfunctioninitObj():void{
- anotherObj.stringProp='anotherObject';
- anotherObj.intProp=8;
- }
- ]]>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj.stringProp"
- click="myObj.stringProp='newstring';"/>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj.intProp"
- click="myObj.intProp=10;"/>
- <mx:Buttonlabelmx:Buttonlabel="ChangemyObj"
- click="myObj=anotherObj;"/>
【编辑推荐】