专家答疑 什么是Flex事件机制

开发 后端
本文向大家介绍一下Flex事件机制的概念,Flex事件可以看作是一种触发机制,当满足了一定的条件后,会触发这个事件。比如MouseEvent就是指的当鼠标进行操作之后触发的一系列的事件。

在学习Flex的过程中,Flex事件机制是非常重要的内容,这里和大家分享一下它的概念,很多控件中都有click事件,这个事件就是一个MouseEvent的实例,当点击鼠标后,系统会自动抛出一个名称为click的MouseEvent事件。

什么是Flex事件机制

Flex事件可以看作是一种触发机制,当满足了一定的条件后,会触发这个事件。比如MouseEvent就是指的当鼠标进行操作之后触发的一系列的事件。很多控件中都有click事件,这个事件就是一个MouseEvent的实例,当点击鼠标后,系统会自动抛出一个名称为click的MouseEvent事件(这种方法我们将在后面介绍到)。如果此时在click上注册一个方法,那么触发该事件时就会执行这个方法。

1.Flex事件机制中Flex事件分发

最终继承自EventDispatcher的对象都会含有dispatchEvent这个方法,他有一个参数,事件对象。
之前说到的事件注册通道,他只是一个通道,实际上事件是由这个方法来分发出去的,通道只是一个管道而已。

他的作用就是分发一个事件对象,他的分发是没有目的的,一种广播形式的,Flex的事件监听线程会接收到各种各样的事件(我们称之为捕获事件,这在后面会介绍到),那么哪种才是你要的事件,标识就通过事件的type属性来区分。

◆Flex事件对象

在Flex事件机制的分发事件发生时,将会分发一个事件对象出去。不管是那个事件类,都是继承自flash.events.Event对象的,他包含一些比较重要的属性,type和bubbles。
type是事件的类型,事件监听通过这个参数来识别是否是自己所监听的事件。
bubbles是个布尔值,决定了该对象是否会向上传递。默认是false。什么意思呢?画个图就明白了。
比如说,当button组件分发click事件对象时,设置的bubbles为false,那么他的分发是这样的

示意代码 

  1. dispatchEvent(newMouseEvent(“click”,false)); 

事件对象无法跨越组件本身,当然,除了之前讲到的注册通道(这样就很形象了吧)
因此,如果没有注册通道,在Flex主应用中,就无法捕获到这个button组件分发出的事件。

如果我们将Bubbles设为true,他看起来就是这样
 

  1. dispatchEvent(newMouseEvent(“click”,true)); 

可以看到,这个事件可以跨过组件本身,到达Flex主应用里。不止这样,在帮助手册中明确说到,如果在传递过程中间一直没有被捕获的话,这个事件会逐层上传,直到最终的stage,那时如果还没被捕获,这个事件就会被销毁掉。

这样一来,即使我们没有click的事件通道,只要我们在Flex主应用中添加Flex事件监听器(addEventListener)那么我们就可以获得到这个分发出的click事件了。
那么,注册通道不是没用了吗?不是,之前说到过,注册通道是现式的,可见的,因此如果你的组件要给其他人使用,那么就非常一目了然,而不必知道你源码中究竟分发了什么事件。但是,不要监听和注册同一个事件,这样会重复执行的。(后面将讲到)

2.Flex事件监听

在Flex事件机制的分发中,我们讲到,如果不是通过注册通道来调用触发事件,那么我们是需要一个监听来捕捉的。如何捕捉到分发出的事件,就是通过Flex事件的type值。

比如: 

  1. <mx:Applicationxmlns:mxmx:Applicationxmlns:mx=http://www.adobe.com/2006/mxmllayout="absolute" 
  2.  
  3. xmlns:compcreationComplete='init()' 
  4. > 
  5. <mx:Script> 
  6. <![CDATA[  
  7. privatefunctioninit(){  
  8. testBtn.addEventListener(“click”,clickHandler);  
  9. }  
  10.  

 Flex的事件中都提供了一些静态常量,让我们调用,避免我们打错了。因此这句话可以这么写 

  1. testBtn.addEventListener(MouseEvent.CLICK,clickHandler); 

我们看到,监听的回调方法中没有传递参数,是的,这和通道的写法有些不同,这里的回调方法(即clickHandler)只是个引用,并不是代表方法的执行,他的含义是,告诉eventLinstener,如果捕捉到click事件,那么就去找clickHandler,并执行它,event对象参数在执行时动态的传递。(如果熟悉ajax的朋友这里应该很容易懂了)

他作用起来就是这样,如果你又注册了click的事件通道,那么这两个都会生效,显然这是多余的。

3.Flex事件机制关于异步和执行顺序

以前的说法有误,as里是不存在线程概念的,在远程请求时,结果事件、错误事件都是异步的。如果你需要处理结果,需要利用监听,并在回调中获取你的远程数据。
而在处理本地事件时,他们仍然是同步的。

回调方法执行的顺序甚至还不如dispatchEvent之后的方法。如果接下来的方法依赖于事件回调,那么把接下来的方法写到回调方法中去。

【编辑推荐】

  1. 全面认识Flex事件机制
  2. Flex主题创建及支持的样式设置方式
  3. 解析Flex事件机制中Flex事件分发和监听
  4. Flex事件机制用法揭秘
  5. Flex数据绑定及其使用频繁的几种情况 
责任编辑:佚名 来源: csdn.net
相关推荐

2010-08-04 15:55:08

Flex是什么

2010-06-10 16:27:17

什么是uml

2010-09-17 13:10:29

JVMJava虚拟机

2010-07-06 11:51:21

UML活动图

2010-06-07 19:27:40

UML是什么

2010-08-04 13:52:53

Flex事件机制

2010-08-06 10:03:42

Flex事件

2010-08-12 15:35:44

Flex事件机制

2010-08-06 09:45:50

Flex事件机制

2010-09-28 11:32:30

HTML DOM是什么

2010-08-04 14:07:59

Flex事件机制

2010-07-29 10:33:59

Flex键盘事件

2010-08-25 10:28:05

margin

2010-09-26 10:29:45

JVMJava虚拟机

2009-07-20 10:36:29

什么是JDBC

2010-08-06 09:56:06

Flex事件机制

2010-08-09 11:06:01

Flex事件机制

2010-08-04 14:02:08

Flex事件机制

2010-07-05 10:20:27

UML图

2010-08-13 14:05:24

Flex事件机制
点赞
收藏

51CTO技术栈公众号