注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mississippi的博客

学习使人进步

 
 
 

日志

 
 

集合事件和手动通知数据改变  

2009-07-08 00:38:31|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

集合使用事件传递数据变化信息,因此,我们能使用这些事件监控数据变化。

集合事件

集合使用三种事件:CollectionEvent、PropertyChangeEvent和 FlexEvent:

当集合变化时,它发布CollectionEvent事件。

事件名为CollectionEvent.COLLECTION_CHANGE(“collectionChange”)。——所谓集合变化,是指该集合发生增(add)、删(remove)、改(setItem)以及排序和过滤操作——如果是使用集合提供的方法改变集合的话,都会引发CollectionEven事件,但是,如果集合元素为常规数据类型,且是深入集合内部修改其元素的话,则不会引发事件。如下例这样修改集合的话,没事件发生:

ac = new ArrayCollection([new Object(),new Object()]);

var v:Object = Object(ac.getItemAt(0));

v.a = "aaa";

但是——如果元素是ObjectProxy,则又能发布事件:如

ac = new ArrayCollection([new ObjectProxy(),new ObjectProxy()]);

var v:ObjectProxy = ObjectProxy(ac.getItemAt(0));

v.a = "aaa";

且这个事件的kind是update。

思考题:为什么元素是ObjectProxy能引发事件而Object却不能?

 

CollectionEven事件有对象几个重要的属性:

1、kind:集合变化的类型,有add、remove、reset、replace、update等。

2、items:发生变化的项目数组,其返回数据取决于kind类型,当add和remove时,返回增删的项目数组;当update时,返回一个PropertyChangeEvent对象(属性改变事件)——因为update是在集合内部修改,相当于是修改了其属性,这个事件对象也包含旧值oldValue和新值newValue属性——这种现象比较特殊:一个事件(CollectionEven)的属性值是另一个事件(PropertyChangeEvent);当replace时,表明集合使用了setItemAt方法,它跟update一样,返回一个PropertyChangeEvent对象。

对于指针集合,如指针位置改变,则发布FlexEvent事件。

根据集合引发的事件,我们可以依据CollectionEventKind做出视图数据更新的处理逻辑(不是绑定)。

 

关于集合的itemUpdated方法

上例中,集合元素是ObjectProxy能引发事件而Object却不能,是因为Object没有实现IEventDispatcher接口,它的任何改变都不能发布事件。所以通常集合的元素都设置成ObjectProxy等能发布事件的对象。

如果已经使用了Object作为元素怎么办?没关系,FLEX非常友好地提供了一个手动引发CollectionEvent事件的方法——itemUpdated()——但是,它仅仅能在数据改变时引发事件,如是增加或者删除元素,它就无能为力了。

如,将上例改为:

ac = new ArrayCollection([new Object(),new Object()]);

var v:Object = Object(ac.getItemAt(0));

ac.itemUpdated(ac.getItemAt(0),"a",null,"aaa");

OK,一切正常,引发了CollectionEvent事件。

 

关于enableAutoUpdate()和disableAutoUpdate()方法

没什么好解释的,主要作用就是先暂停集合发布事件,等想更改的集合元素都改完了,再一次性发布一个事件。——可有效增强程序的执行效率,仅此而已。

 

  评论这张
 
阅读(828)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017