Flex信号量(Signal)与数据绑定(SignalBinding)初探

     相信大家在flex的开发过程中,经常会使用事件机制的方式传递数据,下面我介绍通过信号量Singal方式来传递数据,并通过数据绑定的方式改变控件的值。从而就实现了动态改变组件数据源了。下面将讲述这个过程。

   讲述之前:大家可以查看这个网址: http://www.ericfeminella.com/blog/2010/03/22/as3-signals-simulated-data-binding/, 以获得更详细的内容。

   下面是我写的一个简单的例子。

  SingalFlexDemo.mxml文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   minWidth="955" minHeight="600"
			   initialize ="init();"
			   >
	
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	
	<fx:Script>
		<![CDATA[
			import com.singal.app.TitleModel;
			private var _pm:TitleModel = null;
			
			private function init() : void
			{
				_pm = new TitleModel("minggxu8"); 
				
				// Add binding between the Model's 'title'
				// property and the views 'titleLabel.text' 
				// property. Assignments to "title" will now 
				// be reflected in 'titleLabel.text'
				_pm.addTitleBinding( titleLabel, "text" );
			}
			
			protected function changeBtn_clickHandler(event:MouseEvent):void
			{
				// TODO Auto-generated method stub
				//_pm = new TitleModel("minggxu9"); 
				_pm.changeValue();
			}
			
		]]>
	</fx:Script>
	<s:Label id="titleLabel"  text="mingg"/>
	<s:Button id="changeBtn" x="0" y="44" label="ClickMe" click="changeBtn_clickHandler(event)"/>
</s:Application>

2.as处理类,如下所示

package com.singal.app
{
	import com.ericfeminella.support.signals.binding.SignalBinding;
	import com.ericfeminella.support.signals.binding.SignalDataBinding;
	
	import mx.controls.Alert;
	
	import org.osflash.signals.Signal;

	public class TitleModel
	{
		private var _bindings:SignalDataBinding = null;
		private var _singalBinding:SignalBinding;
		private var _titleChanged:Signal      = null;
		private var _title:String             = null;
		
		public function TitleModel(value:String){
			_bindings = new SignalDataBinding(true, true);
			
			_titleChanged = new Signal(String);
			_titleChanged.add(titleChangeListener);
			this.title = value;
		}
		
		public function titleChangeListener(value:String):void{
			Alert.show(value);
		}
		
		public function get title() : String 
		{ 
			return _title; 
		}
		
		public function set title(value:String) : void
		{
			_title = value;
			_titleChanged.dispatch( value );
		}
		
		
		public function changeValue():void{
			this.title =  "Message " + Math.random() * 1000;
		}
		
		// Model class provides an API for property specific 
		// bindings while not exposing the underlying binding 
		// mechanism, thus  allowing the data binding facility 
		// to be changed transparent to that of a client's
		// implementation.
		public function addTitleBinding(host:*, property:*):void
		{
			_bindings.addBindableListener(_titleChanged, host, property);
		}
	}
}

3.简单说明

3.1信号号说明:

var _titleChanged:Signal  =  new Signal(String);

发送信号

_titleChanged.dispatch( value );

接收信号

_titleChanged.add(titleChangeListener);

  public function titleChangeListener(value:String):void{
Alert.show(value);
}

3.2 信号量与数据绑定说明:

var _pm:TitleModel  = new TitleModel("minggxu8"); 

     添加控件绑定

_pm.addTitleBinding( titleLabel, "text" );

    改变数据

_pm.changeValue();

 改变值的同时,该控件的值同时也会改变,因为它们已经绑定在一起了。所以会同时变化。

(个人理解,以官方为准。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值