Flex3 双向绑定 完善版

大家好,这是我博客转移阵地以来第一篇文章

(原技术博客http://emavaj.blog.163.com)

 

最近做Flex项目,碰到了双向绑定的问题,

查了下网上,有解决方法

 

简单说就是 2个单项绑定 + 简易的同步机制

 

看代码:

/**实现双向绑定工具类*/
	public class BindingUtil{
		
		
		/**绑定方法*/
		public static function bind(obj1:Object,prop1:String,obj2:Object,prop2:String):void{
			
			/**是否在改变标志,类似 数据同步机制*/
			var flag:Boolean = false;
			
			ChangeWatcher.watch(obj1,prop1,function(event:Event):void{
				if(!flag){
					/**锁定对象*/
					flag = true;
					obj2[prop2] = obj1[prop1];
					/**解锁对象*/
					flag = false;
				}
			});
			
			ChangeWatcher.watch(obj2,prop2,function(event:Event):void{
				if(!flag){
					/**锁定对象*/
					flag = true;
					obj1[prop1] = obj2[prop2];
					/**解锁对象*/
					flag = false;
				}
			});
		}
	}

 

可以看到

 

使用了ChangeWatcher注册了一个函数,并且使用了闭包的特性

使得 var flag:Boolean 变量可以 在匿名函数中使用

 

其实 flag的作用就是 类似 java的synchronized

 

放置时间争抢改变属性的作用

 

 

但是如果像这样写,那么不是很理想

 

我改了一下:

/**实现双向绑定工具类*/
	public class BindingUtil{
		
		public var watchers:ArrayCollection = new ArrayCollection();
		
		/**绑定方法*/
		public function bind(
			obj1:Object,prop1:String,
			obj2:Object,prop2:String):void{
			
			/**是否在改变标志,类似 数据同步机制*/
			var flag:Boolean = false;
			
			var tempwatcher1:ChangeWatcher = ChangeWatcher.watch(obj1,prop1,function(event:Event):void{
				if(!flag){
					/**锁定对象*/
					flag = true;
					obj2[prop2] = obj1[prop1];
					/**解锁对象*/
					flag = false;
				}
			});
			
			var tempwatcher2:ChangeWatcher = ChangeWatcher.watch(obj2,prop2,function(event:Event):void{
				if(!flag){
					/**锁定对象*/
					flag = true;
					obj1[prop1] = obj2[prop2];
					/**解锁对象*/
					flag = false;
				}
			});
			
			this.watchers.addItem(tempwatcher1);
			this.watchers.addItem(tempwatcher2);
		}
		
		/**解除绑定*/
		public function unbind():void{
			for(var i:int = 0; i<this.watchers.length; i++){
				ChangeWatcher(this.watchers.getItemAt(i)).unwatch();
			}
		}
	}

 

 

加入了属性,保存了所有的绑定,

 

也提供了解除绑定的方法

 

这样的好处,不言而喻吧,当你同个视图想绑定不同对象的时候,那么就派上用场了!

 

小弟初来咋到,请大家多指教!

你可能感兴趣的:(Blog,Flex)