加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex企业应用开发实战学习笔记(二)

发布时间:2020-12-15 04:41:17 所属栏目:百科 来源:网络整理
导读:转自http://blog.csdn.net/spring19840513/article/details/6909442 使用Bindable元数据标记 ????????? 1. 在public类定义之前使用 在这个地方使用[Bindable]元数据标记使得类中定义的全部public变量以及同时具有setter和getter方法的public属性能成为数据绑

转自http://blog.csdn.net/spring19840513/article/details/6909442

使用Bindable元数据标记

?????????

1. 在public类定义之前使用

在这个地方使用[Bindable]元数据标记使得类中定义的全部public变量以及同时具有setter和getter方法的public属性能成为数据绑定表达式的源。这种情况下,[Bindable]不使用任何参数,如下代码所示。

 
 
  1. [Bindable] ?
  2. public?class?TextAreaFontControl?extends?TextArea?{}?

Flex编译器自动为所有public属性生成名为propertyChange,类型为PropertyChangeEvent的事件,以使这些属性可以作为数据绑定表达式的源。


注意??在public class定义之前使用[Bindable]元数据标记只是将绑定作用于public属性,它不会作用于private和protected属性以及那些定义在其他namespace中的属性,必须在非public属性前插入[Bindable]元数据标记才能使之成为数据绑定表达式的源。


2. 在public、protected或private属性之前使用

在public、protected或private属性之前使用[Bindable]标记可以将这个特定的属性定义为支持数据绑定的,如下代码所示。

 
 
  1. [Bindable] ?
  2. public?var?foo:String; ?
  3. [Bindable] ?
  4. protected?var?foo3:String; ?
  5. [Bindable] ?
  6. private?var?foo2:String;?

Flex编译器自动为那个属性产生名为propertyChange,类型为PropertyChangeEvent的事件。如果写入的属性值不变,Flex不会发出事件或更新属性。也可以在[Bindable]元数据标记中指定事件名,如下代码所示。

 
 
  1. [Bindable(event="fooChanged")] ?
  2. public?var?foo:String;?

在这种情况下,开发者要自己负责创建和发出事件才能触发数据绑定,通常在类的其他方法中完成这些工作。尽管在类的级别上指定了[Bindable]标记,如果想要为触发数据绑定的事件命名,仍然可以在[Bindable]中包含指定名称的事件。

3. 在由getter或setter方法所定义的public、protected或private属性之前使用

在由getter或setter方法所定义的public、protected或private属性之前使用该标记。在这种情况下,要使用[Bindable]标记必须同时为属性定义setter和getter方法。


绑定到函数、对象和数组

1. 绑定函数

在Flex中,可将函数作为数据绑定表达式中的一部分。在数据绑定表达式中使用函数的两种常见用法如下所示。

将“可绑定的”属性作为函数的参数,如下所示。

 
 
  1. <?xml?version="1.0"?>?
  2. <!--?binding/ASInBraces.mxml?-->?
  3. <mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml">?
  4. ????<mx:CurrencyFormatter?id="usdFormatter"?precision="2"?
  5. ????????currencySymbol="$"?alignSymbol="left"/>?
  6. ????<mx:TextInput?id="myTI"?text="Enter?number?here"/>?
  7. ????<mx:TextArea?text="{usdFormatter.format(myTI.text)}"/>?
  8. </mx:Application>?

以函数作为绑定表达式的源。

可以把有返回值的函数作为数据绑定表达式的源。但是,必须有一种办法能够激活这个函数以更新目的属性,那就是使用[Bindable]元数据标记。在代码清单2-14中,使用了[Bindable]元数据标记指示Flex在myFlagChanged事件被派发时调用isEnabled()函数。当myFlag的 setter方法被调用时会派发一个myFlagChanged事件,这个事件触发任何使用isEnabled()函数作为源的数据绑定。

代码清单2-14?? 以函数作为绑定表达式的源

 
 
  1. <?xml?version="1.0"?>?
  2. <!--?binding/ASFunction.mxml?-->?
  3. <mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml">?
  4. ????<mx:Script>?
  5. ????????<![CDATA[ ?
  6. ????????????import?flash.events.Event; ?
  7. ????????????//?定义一个能够响应myFlagChanged事件的,可以作为绑定源的函数。 ?
  8. ????????????[Bindable(event="myFlagChanged")] ?
  9. ????????????private?function?isEnabled():String?{ ?
  10. ????????????????if?(myFlag) ?
  11. ????????????????????return?'true'; ?
  12. ????????????????else ?
  13. ????????????????????return?'false'; ?
  14. ????????????} ?
  15. ????????????private?var?_myFlag:Boolean?=?false; ?
  16. ????????????//?定义一个能够派发myFlagChanged事件以触发数据绑定的setter方法。 ?
  17. ????????????public?function?set?myFlag(value:Boolean):void?{ ?
  18. ????????????????_myFlag?=?value; ?
  19. ????????????????dispatchEvent(new?Event("myFlagChanged")); ?
  20. ????????????} ?
  21. ????????????public?function?get?myFlag():Boolean?{ ?
  22. ????????????????return?_myFlag; ?
  23. ????????????} ?
  24. ????????]]>?
  25. ????</mx:Script>?
  26. ????<!-使用函数作为数据绑定表达式的源?-->?
  27. ????<mx:TextArea?id="myTA"?text="{isEnabled()}"/>?
  28. ????<!--更改属性使得setter方法被调用,从而派发myFlagChanged事件,以触发数据绑定。 ?
  29. ????-->?
  30. ????<mx:Button?label="Clear?MyFlag"?click="myFlag=false;"/>?
  31. ????<mx:Button?label="Set?MyFlag"?click="myFlag=true;"/>?
  32. </mx:Application>

2. 绑定对象

在项目中,我们会大量使用对象作为绑定表达式的源。在运行过程中,对象绑定失效的原因一般有如下两种。

尽管绑定的对象属性是可绑定的,但声明的对象引用不是可绑定的,如下代码所示。

 
 
  1. //忘记声明该引用可绑定属性,即没有放置[Bindable]元数据标记 ?
  2. private?var??foo:MyObject=null; ?
  3. ... ?
  4. //尽管MyObject类的name属性是可绑定的,但由于foo是 不可绑定的,所以绑定表达式不会起作用。 ?
  5. <mx:TextArea?id="myTA"?text="{foo.name}"/>?

尽管声明的对象引用是可绑定的绑定,但绑定的对象属性是不可绑定的,如下代码所示。

 
 
  1. //?MyObject实例的引用foo是可绑定的.?但MyObject类的name属性是不可绑定的。 ?
  2. [Bindable] ?
  3. private?var??foo:MyObject=null; ?
  4. ... ?
  5. //尽管foo是可绑定的,但由于MyObject的name属性是 不可绑定的,所以绑定表达式不会起作用。 ?
  6. <mx:TextArea?id="myTA"?text="{foo.name}"/>?

3. 绑定数组

在使用数组进行工作时,比如Array或ArrayCollection对象,可以把数组作为数据绑定表达式的源或目的。

注意?? 当使用数组作为绑定源时,应该使用ArrayCollection类型的数组,因为ArrayCollection类在数组或数组元素发生变化时能够发出事件来触发数据绑定。比如,对ArrayCollection.addItem()、ArrayCollection.addItemAt()、ArrayCollection.removeItem(),以及ArrayCollection.removeItemAt()方法的调用都会触发数据绑定。

绑定数组时主要应考虑两种情况:以数组作为数据绑定源和以数组元素作为数据源。以数组为数据源是我们最常用的一种情况,这时应当使用ArrayCollection,上面已经重点提示过,下面我们主要考虑以数组中的元素作为数据绑定源,如代码清单2-15所示。

代码清单2-15?? 以数组中的元素作为数据绑定源

 
 
  1. <?xml?version="1.0"?>?
  2. <!--?binding/ArrayBinding.mxml?-->?
  3. <mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml">?
  4. ????????<mx:Script>?
  5. ????????<![CDATA[ ?
  6. ????????????import?mx.collections.ArrayCollection; ?
  7. ????????????[Bindable] ?
  8. ????????????public?var?myAC:ArrayCollection?=?new?ArrayCollection([ ?
  9. ????????????????"One",?"Two",?"Three",?"Four"]); ?
  10. ????????????[Bindable] ?
  11. ????????????public?var?myAC2:ArrayCollection?=?new?ArrayCollection([ ?
  12. ????????????????"Uno",?"Dos",?"Tres",?"Quatro"]); ?
  13. ????????]]>?
  14. ????</mx:Script>?
  15. ????<!-应用启动时或当myAC被改变时,数据绑定会被更新-->?
  16. ????<mx:Text?id="text1"?text="{myAC[0]}"/>?
  17. <!-应用启动时或当myAC被改变时或当myAC[0]被改变时,数据绑定会被更新???-->?
  18. ????<mx:Text?id="text2"?text="{myAC.getItemAt(0)}"/>?
  19. ????<mx:Button?id="button1"?
  20. ????????label="Change?Element"?
  21. ????????click="myAC[0]='new?One'"/>?
  22. ????<mx:Button?id="button2"?
  23. ????????label="Change?ArrayCollection"?
  24. ????????click="myAC=myAC2"/>?
  25. </mx:Application>?

如果通过方括号[]语法来指定数组元素作为数据绑定表达式的源,那么数据绑定只在应用启动时触发,或者在数组或其引用被更新时触发。但是,当这个数组元素被更新时不会触发数据绑定,而数据绑定表达式中的myAC.getItemAt(0)则会在该数组元素变化时被触发更新。因此,id为text2的Text控件在点击button1时会被更新,而id为text1的Text控件则不会被更新。点击button2时将myAC2复制给myAC,这会触发所有对数组元素的绑定而不论是使用方括号[]语法还是使用getItemAt()函数。

注意?? 绑定数组元素最好使用getItemAt()函数,而不是方括号[]语法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读