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

来源:互联网 发布:linux 线程cpu利用率 编辑:程序博客网 时间:2024/06/10 01:34

事件派发规则

            事件派发规则总结起来有三条:

             1)当事件源对象是一个不在显示列表中的孤立对象时,被派发的事件只能传给自己。

             2)当事件源对象是一个在显示列表中时,事件从最顶级舞台对象开始,向下穿行事件源对象的各级父显示对象,直到到达事件源对象。如果在构造事件时“bubbles”属性为true时,事件则由当事件源对象开始,向上穿行事件源对象的各级父显示对象,直到到达最顶级舞台对象。

             3)某些特殊类型的事件(如enterFrame和init类型事件等)会直接派发到事件源对象上,并不参与捕获阶段和冒泡阶段。


在Flash Player中,事件派发不是异步的而是按照事件流所经过的目标对象的顺序以及目标对象上注册的事件监听器的优先级顺序地执行每个事件监听器中的代码。

例子:

          this.dispatchEvent(testEvent);

          trace("当testEvent对象的所有侦听器都执行完毕后才能看见我!");


实现数据绑定的方法

1. 使用MXML中的大括号({})语法进行数据绑定

大括号语法就是我们常说的数据绑定表达式是最常用的一种数据绑定方式。但是,很多人并没意识到数据绑定表达式的超强表达能力。在数据绑定表达式中,可以使用ActionScript代码以及E4X表达式。

在大括号绑定表达式中使用ActionScript代码的规则:ActionScript代码必须有返回值,且返回值类型必须与目的属性兼容,可以在表达式中使用有返回值的函数、字符串连接符、算术操作表达式和逻辑操作表达式。下面举一个稍微复杂的例子:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" width="293" height="135"> 
  3.    <mx:TextInput id="TI_Src" x="10" y="10" width="251"/> 
  4.       <mx:Text id="Text_Des" x="10" y="50"  width="251" height="24" 
  5. text="{TI_Src.text.length>10?TI_Src.text.substr(0,10):  
  6. TI_Src.text}"/> 
  7. </mx:Application> 

在这个例子中,我们在Text_Des.text属性和TI_Src.text属性之间建立绑定关系,TI_Src.text是源属性,Text_Des.text是目的属性,表达式{TI_Src.text.length>10 ? TI_Src.text.substr(0,10):TI_Src.text}使用了?操作符,整个表达式的含义是:如果TI_Src.text长度大于10,那么Text_Des.text属性值是TI_Src.text属性值的前10个字符。

注意   实际项目中的绑定表达式可能更为复杂,尤其会用到逻辑操作符和条件操作符, &和< 这两个字符被XML占用,不能用在绑定表达式中,必须使用&amp;和&lt;进行替换。


2. 使用<mx:Binding>标记进行数据绑定

可以用<mx:Binding>标记作为大括号语法的替代方法。在使用<mx:Binding>时,要为<mx:Binding>标记提供一个源属性作为标记的source属性,并提供一个目的属性作为标记的destination属性。在<mx:Binding>标记中,source属性可以使用{}表达式来表示含义更丰富的源属性,如下代码所示。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" width="293" height="135"> 
  3.    <mx:Binding source="{TI_Src.text.length>10?TI_Src.text.substr(0,10):TI_Src.text}" destination="Text_Des.text" /> 
  4.    <mx:TextInput id="TI_Src" x="10" y="10" width="251"/> 
  5.    <mx:Text id="Text_Des" x="10" y="50"  width="251" height="24" /> 
  6. </mx:Application> 

在实际项目中,大括号语法主要用于将视图上的控件属性作为目的属性与模型上的对象属性进行绑定,从而使视图上的控件属性可以随着模型数据的变化而变化。但有时候,我们需要模型对象上的数据随着视图上控件的输入数据的变化而变化,这就需要使用<mx:Binding>标记,如代码清单2-9所示。

代码清单2-9   使用<mx:Binding>标记进行数据绑定

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" width="293" height="135"> 
  3.   <mx:Script> 
  4.          <![CDATA[  
  5.             [Bindable]  
  6.              private var deptName:String="defaultDeptName";  
  7.          ]]> 
  8.   </mx:Script> 
  9.   <mx:Binding source="TI_DeptName.text" destination="this.deptName"/> 
  10.   <mx:TextInput id="TI_DeptName" x="21" y="10" width="251" text"{this.deptName}"/> 
  11. </mx:Application> 

在这个例子中,TI_DeptName.text会随着模型数据deptName的变化而变化。另外,模型数据deptName也会随着TI_DeptName.text的变化而变化。

<mx:Binding>标记的另一个作用就是能够建立同一个目的属性与多个不同源属性的绑定关系。

3. 使用ActionScript中的BindingUtils的系列方法进行绑定

大括号语法和<mx:Binding>标记都只能在编译期定义数据绑定,而使用ActionScript代码则可以在运行期动态定义数据绑定,如代码清单2-10所示。

代码清单2-10   使用BindingUtils系列方法实现数据绑定

  1. <?xml version="1.0"?> 
  2. <!-- binding/BasicBindingAS.mxml --> 
  3. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> 
  4.     <mx:Script> 
  5.       <![CDATA[  
  6.         import mx.binding.utils.*;  
  7.         //定义数据绑定  
  8.         public function initBindingHandler():void {  
  9.             BindingUtils.bindProperty(myText, "text", myTI, "text");  
  10.         }  
  11.       ]]> 
  12.     </mx:Script> 
  13.     <mx:TextInput id="myTI"/> 
  14.     <mx:Text id="myText" preinitialize="initBindingHandler();"/> 
  15. </mx:Application> 
注意   上面的例子使用了preinitialize事件定义数据绑定,必须这样做,因为在应用启动过程中,当源对象发出initialize事件时,Flex会触发所有的数据绑定。如果在initialize事件之后定义绑定,则目的属性无法从源属性获取初始值。有关数据绑定何时发生的更详细信息参考


尽管Felx提供的BindingUtils的系列方法能够在运行期动态定义数据绑定,但是实际项目中很少用到这种方法,因为与编译期在MXML中定义数据绑定相比,运行期在ActionScript中定义数据绑定有如下不方便之处:

不能在由bindProperty()或bindSetter()方法定义的绑定表达式中引入ActionScript代码,但可以弥补的是:使用bindSetter()方法可以指定一个在绑定发生时调用的方法。

不能在由ActionScript中定义的绑定表达式中引入E4X表达式。

不能在由bindProperty()或bindSetter()方法定义的数据绑定表达式的属性链中引入函数或数组元素。

MXML编译器有更好的警告和错误检查支持。


原创粉丝点击