关于Flex Cairngorm中command层与View层的通信及耦合度高的问题
在Cairngorm框架中,view层发送自定义事件,command层再根据事件做相应的处理,View层中的数据通过绑定ModelLocator中的属性实现自动更新。现有的问题是,有时除了更新数据意外,用户需要更多的信息,比如,我需要判断后台返回的数据是否正确,或者,我需要更具返回的数据做下一步的处理。
command如何让View去执行下一步的方法呢? 1.传统的做法(command操纵view的引用) private function onResult_delete(e:ResultEvent):void { if (e.result != null) { var result:String=e.result.code as String; if (result == "success") { Alert.show("删除成功!"); (_model.userManagerModel.view as Object).doSuccess(); } } else { Alert.show("修改失败!"); (_model.userManagerModel.view as Object).doFail(); } } 将view存入ModelLocator的_model.userManagerModel.view中,在command强制转换为Object从而拿到view的引用 方法B:用到框架中的ViewHelper和ViewLocator这两个类。 package domain.app.view{ import com.adobe.cairngorm.view.ViewHelper; public class LoginViewHelper extends ViewHelper{ public function doSomething(){ //do something with the protected property view. } } }
在视图中实例化这个ViewHelper 但方法同样存在耦合度高的问题,故 Cairngorm 3版本中已经废弃 2.现有做法(事件通信) public class MyEvent extends CairngormEvent { public static const DEL:String = "DEL"; //删除 public static const DEL_COMPLETE:String = "DEL_COMPLETE"; //删除数据 处理完后处理事件 /*返回参数类型 "success""exist""fail"*/ public var code:String =""; /*事件类型*/ public var event_type:String=""; public function MyEvent(type:String) { this.event_type=type; super(type); } } 其中DEL是交给command处理的,所以要在FrontController中做一个绑定;DEL_COMPLETE则不需要 this.addCommand(MyEvent.DEL,UserManagerCommand);
command 在处理完DEL后,就发送一个DEL_COMPLETE事件,此时,view在监听这个事件的CairngormEventDispatcher.getInstance()就可以执行相应的方法了 下面是commad的操作 private function onResult_delete(e:ResultEvent):void { var event:MyEvent = new MyEvent(MyEvent.DEL_COMPLETE); if (e.result != null) { var result:String=e.result.code as String; if (result == "success") { event.code = "success"; }else{event.code = "fail" } } else { event.code = "fail" } /*发送处理事件*/ event.dispatch(); }
下面是view的操作 private function init():void { var e :MyEvent = new MyEvent(MyEvent.DEL); e.dispatch(); /* 监听 数据返回 */ CairngormEventDispatcher.getInstance().addEventListener(MyEvent.DEL_COMPLETE,del_compelete); } } /************************************************************** * 函数:command处理完成后执行方法 */ private function del_compelete(e:MyEvent):void { CairngormEventDispatcher.getInstance().removeEventListener(MyEvent.EDIT_COMPLETE,del_compelete); if (e.code =="success"){ Alert.show("删除成功!"); doSuccess(); } else if (e.code =="fail"){ Alert.show("删除失败!"); doFail(); } } 这样,view和command耦合性的问题得到解决。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |