相信大家在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();
改变值的同时,该控件的值同时也会改变,因为它们已经绑定在一起了。所以会同时变化。
(个人理解,以官方为准。)