Flex对象与组件的数据 双向绑定

it2022-05-05  61

用于Flex中Entity对象与Display对象之间的数据双向动态绑定,支持TextInput、DateField、ComboBox。   1  package  controller.utils{   2       import  com.ericfeminella.collections.HashMap;   3       import  com.ericfeminella.collections.IMap;   4         5       import  flash.display.DisplayObject;   6       import  flash.utils.describeType;   7         8       import  mx.binding.utils.BindingUtils;   9       import  mx.binding.utils.ChangeWatcher;  10       import  mx.events.PropertyChangeEvent;  11       import  mx.utils.ObjectProxy;  12        13       /**  14       * @Description: BindingHelper  15       *  @author  Lyon  16        */  17       public   class  BindingHelper{  18           /**  19           *  目前支持的绑定组件类型   20            */           21           private   static   const  typeMap: Object  =  {     ' mx.controls::TextInput '  :  ' text ' ,  22                                                                           ' mx.controls::DateField '  :  ' selectedDate ' ,  23                                                                           ' mx.controls::ComboBox ' ' selectedItem '  24                                                                          };          25           /**  26           *  存储监控对象的句柄  27           * key: entityObj  28           * value: ChangeWatcher  29            */           30           private   static  var handleList:IMap  =   new  HashMap();  31            32           /**     33           *  对象与组件的数据动态双向绑定    34           *  @param  entityObj   Entity Object  35           *  @param  displayObj  MX控件  36           *  @param  type                 控件类型,如:'mx.controls::TextInput'  37           * @exclude                     需要排除的property  38           * @bidirectional               是否做双向绑定(如果为false,那么只做entity到displayObject的绑定)  39           *  @param  commitOnly  40            */       41           public   static  function bidirectionalDataBind(  42                                      entityObj:Object,   43                                      displayObj:DisplayObject,  44                                      exclude:Array = null ,  45                                      bidirectional:Boolean = true ,  46                                      type:String = ' ALL ' ,                                      47                                      commitOnly:Boolean  =   false ): void {  48               if (type  ==   ' ALL ' ){  49                   for  (var typeTmp:String in typeMap){  50                      bidirectionalDataBind(entityObj,displayObj,exclude,bidirectional,typeTmp,commitOnly);  51                  }  52              } else {  53                   // 通过反射机制取出当前MXML中的信息  54                  var instanceInfo:XML = flash.utils.describeType(displayObj);  55                  var properties:XMLList  = instanceInfo..accessor.(@type == type);  56                  var tmpObj:ObjectProxy;  57       //             trace(instanceInfo..accessor.(@type==type));  58        59                  var prop:String  =  BindingHelper.getSiteProp(type);  60        61                   for  each(var propertyInfo:XML in properties){  62                       // 此处取出的为textinput的id  63                        var proName:String  =  propertyInfo.@name;  64                          65                         //  需要排除的property  66                         if (exclude  !=   null   &&  exclude.indexOf(proName)  !=   - 1 ){  67                             continue ;  68                        }  69                          70                         //  检查该property是否存在  71                         if (BeanUtils.checkPropertyExist(entityObj,proName)  ==   false ){  72                             continue ;  73                        }  74                          75                         try {  76                             //  ComboBox  77                             if (type  ==   ' mx.controls::ComboBox ' ){  78                                 if (handleList.getValue(entityObj)  ==   null ){  79                                    handleList.put(entityObj, new  HandleObject(entityObj));  80                                }  81                                  82                              var cw:ChangeWatcher  =  ChangeWatcher.watch(entityObj,proName,setData);  83                              HandleObject(handleList.getValue(entityObj)).addChangeWatcher(proName,cw);  84                                85                              BindingUtils.bindProperty(entityObj,proName,DisplayObject(displayObj[proName]),prop,commitOnly);  86                            } else {  87                                BindingUtils.bindProperty(DisplayObject(displayObj[proName]),prop,entityObj,proName,commitOnly);  88                               if (bidirectional  ==   true )  89                                  BindingUtils.bindProperty(entityObj,proName,DisplayObject(displayObj[proName]),prop,commitOnly);  90                            }  91                       } catch (err:Error){  92                            trace(err.message);  93                        }  94                  }  95              }  96          }  97            98           /**    99           *  清空监控对象的句柄集合 100            */          101           public   static  function clean(): void { 102               if (handleList  !=   null ){ 103                   for  each(var ho:Object in handleList.getValues()){ 104                      HandleObject(ho).clean(); 105                  } 106                   107                  handleList.clear(); 108              } 109          } 110           111           /** 112           *  监听ComboBox事件的变化 113           *  @param  obj 114            */ 115           private   static  function setData(obj:PropertyChangeEvent): void { 116               if (obj.newValue  ==   null ){ 117                   return ; 118              } 119              var ho:HandleObject  =  handleList.getValue(obj.source);             120              var cw:ChangeWatcher  =  ho.getChangeWatcher(obj.property); 121               122               if (obj.newValue is String){ 123                  cw.unwatch(); 124                  cw  =  ChangeWatcher.watch(obj.source,obj.property,setData); 125                  ho.addChangeWatcher(obj.property,cw); 126                   return ; 127              } else {     128                  var code:Object  =  obj.newValue.code; 129                  obj.source[obj.property]  =  code; 130              } 131          } 132           133           /** 134           *  返回组件TYPE对应的需要填充的属性名称  135           *  @param  type 136           *  @return   137            */          138           private   static  function getSiteProp(type: String): String{ 139               for  (var name:String in typeMap){ 140                   if (name  ==  type){ 141                       return  typeMap[name]; 142                  } 143              } 144               return   null ; 145          } 146      } 147  } 148  149  import  mx.binding.utils.ChangeWatcher; 150  import  com.ericfeminella.collections.IMap; 151  import  com.ericfeminella.collections.HashMap; 152  internal  class  HandleObject{ 153           private  var entityObject: * ; 154           private  var properityList:IMap; 155           156           public  function HandleObject(entityObject: * ): void { 157               this .entityObject  =  entityObject; 158              properityList  =   new  HashMap(); 159          } 160           161           public  function addChangeWatcher(propName:Object, cw:ChangeWatcher): void { 162              properityList.put(propName,cw); 163          } 164           165           public  function getChangeWatcher(propName:Object):ChangeWatcher{ 166               return  properityList.getValue(propName); 167          } 168           169           public  function clean(): void { 170               for  each(var cw:Object in properityList.getValues()){ 171                  ChangeWatcher(cw).unwatch(); 172              } 173               174              properityList.clear(); 175          } 176      } 177 

 

 1  package  controller.utils{  2        3       import  com.adobe.serialization.json.JSON;  4        5       import  mx.collections.ArrayCollection;  6       import  mx.utils.ObjectUtil;  7       import  mx.utils.StringUtil;  8   9       /** 10       * @Description: Object Utils 11       *  @author  Lyon 12        */ 13       public   class  BeanUtils{         14           /** 15           *  检查对象的property是否存在 16           *  @param  obj 17           *  @param  proName 18           *  @return   19            */          20           public   static  function checkPropertyExist(targetObj: * , proName:String):Boolean{ 21               if (targetObj as String  22                       ||  targetObj as  int 23                       ||  targetObj as Date 24                       ||  targetObj as Number){ 25                   return   false ; 26              } 27               28              var objInfo:Object  =  ObjectUtil.getClassInfo(targetObj); 29               for  each(var name:String in objInfo.properties){ 30                   if (name  ==  proName){ 31                       return   true ; 32                  } 33              } 34               35               return   false ; 36          } 37 

转载于:https://www.cnblogs.com/zack/archive/2009/04/22/1441520.html

相关资源:DirectX修复工具V4.0增强版

最新回复(0)