一. 事g?
事g可以由外设触? 比如:键盘,鼠标, 也可能是外部输入, 比如:web service的返? 事gq能q件的外观和生命周期发生变化时触发, 比如:lg的创建或者改变大? 所有用户与应用交互都会产生事g.用户没有直接与应用交互也可能产生事g, 比如:数据装蝲完毕. 你可以在E序中用事件监听器监听q些事g. 事g监听器是函数Ҏ(gu)用于响应指定的事? 有时也称之ؓ事g处理? Flex的事件模型基于DOM3事g模型. lg产生z֏事gq消?监听)其他事g.如果一个对象想要了解其他对象事件的信息, 可以注册一个监听器. 当事件发生时,对象z֏此事件到所有注册过的监听器? lg有Flex提供的内Z? 也可以用派?监听模型定义自己的事件监听器, q指定监听器监听何种事g. ? 事g简? 当一个事件被z֏出来? 事g对象从根节点开始自上而下开始扫描display list, 一直到目标对象, 查每个节Ҏ(gu)否有相应的监听器. 目标对象指的是display list中生事件的对象. 比如: <mx:Panel> <mx:HBox> <mx:VBox> <mx:Button /> </mx:VBox> </mx:HBox> </mx:Panel> 如何此时 resize了VBox, 则会从根(Application)开? 下来查Panel, HBox, 直到目标对象-产生resize事g的VBox为止. ? 事g的派? Flex中可以通过dispatchEvent()Ҏ(gu)手工z֏事g, 所有UIComponent的子c都可以调用此方? 语法: objectInstance.dispatchEvent(new Event("event_type"):Boolean 参数event_type是Event对象的type属? 函数的返回值LTrue. 可以使用此方法派发Q意事? 而不仅仅是用戯定义事g, 比如: 可以z֏一个Button的Click事g. var result:Boolean = buttonInstance.dispatchEvent(new Event(MouseEvent.CLICK)); 在Flex应用中不是必d新派发的事gq行处理, 如果触发了一个事? 而没有对应的Listener?Flex忽略此事? 如果想给Event对象d新属? 必ȝ承Eventc?然后定义新属? ?事g的传? 事g触发? Flex?个检事件监听器的阶D? 3个阶D늚发生的顺序如? 1. 捕获 2. 目标 3. 上Q 在Q意一个阶D? 节点们都有机会操作事? 比如: 用户点击了一个在VBox中的Button, 在捕获阶D? Flex查Application对象(根节?和VBox是否有监听器处理此事? Flex然后在目标阶D触发按钮的监听? 在上阶D? VBox和应用以与捕获阶D늛反的序再次获得Z处理事g. 在Actionscript3.0?你可以在L目标节点上注册事件监听器. 但是部分事g会被直接传给目标节点,比如Socketc? 捕获阶段的节炚w序是从父节点到子节点? 而上阶D刚好相? 捕获事g~省是关闭的,也就是说如果要捕获事? 必须昑ּ指定在捕获阶D进行处? 每一个Event都有target和currentTarget属? 帮助跟踪事g传播的过E? 捕获阶段: 在捕获阶D?Flex在显C列表中查事件的先是否注册了事件的监听? Flex从根节点开始顺序而下. 大多数情况中, 根节Ҏ(gu)Application对象. 同时, Flex改变事g的currentTarget? ~省情况? 在此阶段,没有容器监听事g. use_capture参数的值是False,在此阶段d监听的唯一Ҏ(gu)是在调用add_listener? 传入一个ؓTrue值的use_capture参数, 比如: myAccordion.addEventListener(MouseEvent.MOUSE_DOWN, customLogEvent, true); 如果是在Mxml中添加监? Flex讄此参CؓFalse, 没有办法q行修改. 如果讄了use_capture为True, 那么事g不会上? 如果既想捕获又想上Q必调?addEventListener两次. 一ơuse_capture参数为true, 一ơؓfalse; 捕获很少使用, 上Q的用更为普? 目标阶段: 在目标阶D? FlexȀ发事件的监听E序, 不检查其他的节点. 上Q阶段: 事g只在bubbles属性ؓTrue时才q行上Q. 可以上Q的事件包? change, click, doubleClick, keyDown, keyUp, mouseDown, mouseUp. 在上阶D? Flex改变事g的currentTarget属? 而target属性是初始z֏事g的对? 查询事g阶段: 使用事g的eventPhase可以获得事g当前的阶D? 1: CAPTURE_PHASE 2: AT_TARGET 3: BUBBLING_PHASE CZ: private function determineState(event:MouseEvent):Void { Debug.trace(event.eventPhase + ":" + event.currentTarget.id); } 停止传播: 使用下面两个函数停止事g的传? stopPropagation() stopImmediatePropagation() |
我是一个JAVA EE开发h员,从业已经有近七、八q的旉了。对JavaEE的企业用户开发技术框架方面的比较熟?zhn)。对SpringQStrutsQWebworkQHibernate{流行的开源框架也一直在工作中用?/p>
在现在的MVC框架中,我比较們于采用WebWorkQ灵z轻巧Struts2其实质就是对WebWork2的一ơ升U,q也说明了WebWork相对与Struts1的优势所在。在现在的RIA开发成势之后,在工作中也用了DWR做Ajax服务器端的数据处理,q用js template的脚本处理页面显C数据,其中最大的痛苦是调试JavaScriptQ尽我们用了firefox的插件调试javascrpt?/p>
正如?a title="ria" target="_blank">JAVAE序员当如何选择RIA开发环?/a>”所提到ajax的的先天~陷Qƈ不适合RIA的全应用开发,如果只是在页面中的局部用是有一些优势,Ҏ(gu)具体情况选择最合适的?/p>
在Flex的应用程序开发当中,学习了很对范例,基本上浏览了一遍Flex的帮助文档,q自己做了些程序?/p>
其中遇到最大的困难不是在程序调试方面,而且E序理斚w的,代码混ؕQ难以控Ӟ其在多人开发的时候,更加Ҏ(gu)出现q样的情c这L情况下RIA的开发是痛苦的,不适宜的?/p>
Cairngorm开发框架说白了是一个FLEX应用开发的MVC框架Q自q感觉Q。将ModelQviewQControl独立分开Q清晰明了?br />
什么是CairngormQ?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">Cairngorm是一个通过逻辑功能、数据、用戯囑֒代码控制的Q何事情来划分你的应用E序代码的基Ҏ(gu)论,可以叫做MVCQModel-View-ControlQ的一U实跉|式?/p>
Cairngorm的划?/strong>
ViewQ界面)Q?/strong>通过一个或者多个FlexlgQ按钮、面ѝ组合框、Tile{等Q组合在一L一个个命名单元Q绑定数据在Model LocatorQ模型定位器Q中Qƈ且生基于用h作(点击、滚动、拖拽等Q的自定义的Cairngorm事g?/p>
Front ControllerQ前端控制器Q:接收Cairngorm事gq映他们到Cairngorm命o控制器上?/p>
CommandQ命令控制器Q:处理商业逻辑Q调用Caringorm代理和(或)其它命o?/p>
DelegateQ代理)Q?/strong>由命令创建,实例化远E过E调用(HTTP、Web Service{等Qƈ且处理命令的q回l果数据?/p>
ServiceQ服务)Q?/strong>定义q接q程数据存储的远E过E调用(HTTP、Web Service{等Q?br />
Cairngorm
是Iteration::two的开源项? 是用macromedia Flex的RIA开发的最?br />实践(best-practice)框架.
我们从Control说v:
EventBroadcaster是一个单例类(singleton), 用于q播用户动作对应的事? 使用
FrontControllerE微复杂一点点. 用于特定的用户动作分发到指定的命oc?
http://labs.adobe.com/wiki/index.php/Cairngorm
Model LocatorQ模型定位器Q:存储你的应用中所有的Value ObjectsQ数据)和共享变量在一个位|。和Http的Session对象cMQ只是它存储在Flex接口的客L而不是在中间件应用服务器的服务器端?/p>
有关Cairngorm的资料:/P>
?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">Cairngorm基础上开发RIA, 会在Iteration::two的专家体pd现有的灵zdl?br />护企业解x案中辑ֈq.
Cairngorm本nq不是一个完整的企业应用, 它只是提供了一个开发的骨架, Iteration::twoU?br />之ؓ体系.
在这个体pM包括以下几个部分:
1. Business(业务逻辑部分)
2. Command(命o部分)
3. Control(控制部分)
4. Model(数据模型)
5. View(界面视图)
6. VO(ValueObject)
在Control? 定义?个基c? Event, EventBroadcaster, FrontController.
Event用于在应用不同的层之间传递事? q携带事件的数据. 包含type和data两个
成员.
type存放一个区别不同事件的名称,会在FrontController中进行注?
而在命o(Command)cM, 会对事gq行响应.
Ҏ(gu): EventBroadcaster.getInstance().broadcastEvent( ... )
FrontConroller是请求处理的核心c? 整个体系中遍布的EventBroadcaster.getInstance(
).broadcastEvent( ... )q样的调?
都是用来通知监听控制? 用户发出了请? 在实际应用中, 开发者应该生成一?br />FrontContoller的子c?
q在构造函C调用addCommand()注册预期事g的处理命? FrontController的具
体实现类应该创徏一ơ而且只能创徏一?