Flex Data Binding详解

Data BindIng 什么时候发生:

1.在绑定源属性值发生改变时发生。
2.在绑定源发出initialize事件时绑定发生一次。

让属性具有可绑定功能:

一般的,只要在属性前加上
[Bindable] 或
[Bindable(event="eventname")]
元标记即可
注意:
如果没有标出触发绑定的事件,正如[Bindable],Flex会自动为绑定加上propertyChange事件,当源数据发生变化时,Flex将自动派发该事件,触发数据绑定。如果修改后数据和源数据“===”也就是全等,那么Flex将不会触发数据绑定。
如果标出的触发绑定的事件,正如[Bindable(event="eventname")],那么在源数据发生改变的时候,必须dispatch出该事件才能触发数据绑定。不论修改后数据和源数据是否全等,Flex都将会触发数据绑定,需要自己编程控制,例如:
<mx:Script>
<![CDATA[
[Bindable(event="hhhh")]
private var ss:String="aaa";

private function doTest():void
{
ss="bbb";
if(ss!=="aaa") / /判断和源数据是否相等,不相等则触发绑定
this.dispatchEvent(new Event("hhhh"));
}
]]>
</mx:Script>
<mx:Text text="{ss}"/>
<mx:Button click="doTest()"/>
如果没有this.dispatchEvent(new Event("hhhh"))这句,那么你点击按钮是没有设么作用的。 另外当申明自定义触发事件时,用ChangeWatcher来监控其变化,发现虽然目的源值变了,但是ChangeWatcher却监控不到变化,同样ChangeWatcher也监控不到非共有变量的变化。关于ChangeWatcher,下面会提到。
绑定函数——Functions,对象——Object,数组——Arrays
函数:
你可以在{}中直接使用函数。例如:<mx:Text text="{Matn.random()*ss}"/>
上面这个没有什么好讲的,关于函数绑定下面这个比较重要:
<mx:Script>
<![CDATA[
public var ss:String="aaa";

[Bindable(event="hhhh")]
private function gg():String
{
return ss;
}

private function doTest():void
{
ss=Math.random().toString();
this.dispatchEvent(new Event("hhhh"));
}
]]>
</mx:Script>

<mx:Text text="{gg()}"/>
<mx:Button click="doTest()"/>
这样给函数加一个[bindable],便使函数具有绑定功能,但是如果不申明自定义触发事件,只能在组件初始化时绑定一次,点击以上按钮是没有什么作用的。大家可以自己试试。

还有getter和setter函数,比较重要,给getter或setter函数加上[bindable],用不着两个都加,加一个就可以了,例如:
<mx:Script>
<![CDATA[
public var ss:String="aaa";

[Bindable]
public function get gg():String
{
return ss;
}

public function set gg(value:String):void
{
ss=value;
}

private function doTest():void
{
gg=Math.random().toString();
this.dispatchEvent(new Event("hhhh"));
}
]]>
</mx:Script>

<mx:Text text="{gg}"/>
<mx:Button click="doTest()"/>
同样能达到绑定效果,如果只有一个getter方法,那么要想实现数据绑定,就需要申明自定义触发事件了,大家可以自己试试。
对象:
对象绑定最重要的是搞清楚怎么申明才能使其属性具有绑定功能,例如:
申明对象 NonBindableObject
//[bindable] 先注释掉这行,测试
public class NonBindableObject extends Object
{

public function NonBindableObject() {
super();
}

public var stringProp:String = "String property";

public var intProp:int = 52;
}
绑定
<mx:Script>
<![CDATA[
[Bindable]
public var myObj:NonBindableObject = new NonBindableObject();
[Bindable]
public var anotherObj:NonBindableObject =
new NonBindableObject();
public function initObj():void {
anotherObj.stringProp = 'anotherObject';
anotherObj.intProp = 8;
}
]]>
</mx:Script>
<mx:Text id="text1" text="{myObj.stringProp}"/>
<mx:Text id="text2" text="{myObj.intProp}"/>
<mx:Button label="改变 myObj.stringProp"
click="myObj.stringProp = 'new string';"/>

<mx:Button label="改变 myObj.intProp"
click="myObj.intProp = 10;"/>

<mx:Button label="Change myObj"
click="myObj = anotherObj;"/>
如果在申明对象时没有在类前加上[bindable]标签,那么该对象的所有属性是不能被绑定的,也就是说当对象属性发生变化时,不会触发绑定,所以点击前两个按钮都是没有用的,只有当该对象本身发生变化时,才能够触发绑定,正如第三个按钮的操作。
现在取消第一行的注释,使对象属性可绑定,那么再点前两个按钮试试。只要给对象加上[Bindable]元标记,那么会使该对象的所有公有属性——public和拥有getter和setter方法的属性具有绑定功能。
数组:
如果把数组作为绑定对象,那么最好使用ArrayCollection对象,因为当使用ArrayCollection对象的一些API来操作数组会触发数据绑定,如:ArrayCollection.addItem(), ArrayCollection.addItemAt(), ArrayCollection.removeItem(), and ArrayCollection.removeItemAt()方法 ,不然要直接使用Array的话,只用当Array本身发生变化时才触发数据绑定,当数组中某一属性发生变化时是不会触发数据绑定的。例如:
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
public var myAC:Array =["One", "Two", "Three", "Four"];

[Bindable]
public var myAC2:Array =["One1", "Two1", "Three1", "Four1"];
]]>
</mx:Script>
<mx:Text id="text1" text="{myAC[0]}"/>
<mx:Text id="text2" text="{myAC.getItemAt(0)}"/>
<mx:Button id="button1"
label="改变某一属性"
click="myAC[0]='new One'"/>
<mx:Button id="button2"
label="改变对象"
click="myAC=myAC2"/>
当使用[]形式来申明数组时,必须使用ArrayCollection的API方法来实现数据绑定,所以当你点击第一个按钮时,text2发生了改变,而text1没有。
数据绑定除了用[Bindable]标签来申明以外,也可以用<mx:Binding/>组件和ActionScript实现。
用<mx:Binding/>,例如:
<mx:binding source="text1.text" destination="text2.text"/>
<mx:binging source="text2.text" destination="text1.text"/>
<mx:TextInput id="text1"/>
<mx:TextInput id="text2"/>
source为绑定源,destination为目的源,按上面的写法,不论是text1还是text2发生变化,都会引起对方的变化。细心的你也许会想这不会引起死循环吗?答案是否定的,不会引起死循环。我想应该是Flex内部的机制已经优化了这种情况,让其只触发一次。
用ActionScript来绑定:
1.使用bindProperty()。
bindProperty(site:Object, prop:String,host:Object, chain:Object,commitOnly:Boolean = false):ChangeWatcher,例如:
var myc:ChangeWatcher=BindingUtils.bindProperty(text2,"text",text1,"text");
即当text1的值发生变化时text2也跟着变,site为目的对象,prop为目的属性,host为绑定源,china为绑定源属性链——关于属性链下面再讲,commitOnly默认为False,即不管是确认事件还是未确认事件都将触发绑定,而为True时,只有确认事件才能触发绑定,这个一般用不到,和Flex自身的事件机制有关,如果为false的话,当数据改变时将触发两次绑定事件,当为True时,只触发一次,自己可以用bindSetter方法来做测试。当不想绑定时可以用myc.unwatch()方法来解除绑定。

2.使用bindSetter()。
bindSetter(setter:Function, host:Object, chain:Object,commitOnly:Boolean = false):ChangeWatcher,例如:
var myc:ChangeWatcher=BindingUtils.bindSetter(change,text1,"text",true);
private function change(str:String):void
{
text2.text=str;
}
change就是当绑定源发生变化时所触发的函数,其他参数都一样。
3.使用ChangeWatcher.watch()。
同样可以用ChangeWatcher.watch方法来监控对象属性的变化,非常有用。
watch(host:Object, chain:Object,handler:Function,commitOnly:Boolean = false):ChangeWatcher,例如:
var myc:ChangeWatcher=ChangeWatcher.watch(text1,"text",change);
private function change(e:Event):void
{
text2.text=text1.text;
}
这里的Event和绑定数据所定义的触发事件有关,你可以用所有事件的父类Event来表示。

注意:
as主要是通过mx.binding.utils.BindingUtils 这个类来实现数据绑定,用MXML和as实现数据绑定有以下几点不同:
1.当使用AS做数据绑定时,bindProperty()或 bindSetter()方法中不能使用AS代码,这和MXML是不同的, 可以用bindSetter() 方法来申明一个绑定处理函数。
2.当使用AS做数据绑定时,同样不能使用EX4语法,也就是说不能直接使用XML解析语法了。
3.当使用AS做数据绑定时,在属性链中不能使用任何函数和数组。
4.MXML具有更好的错误提示和警告功能。
最后来讲讲属性链。
属性链就是bindProperty()和 bindSettet()等方法中的chain参数所表示的对象, 有时也许绑定源并不只是text1.text这样的简单形式,也可以是类似于user.name.text1.text,那么就存在一个关系链的问题,如果这条链中的某一项发生了改变,会不会触发绑定呢?答案是如果你想让其改变其中的某一项都能触发数据绑定,那么这条链的每个元素必须是可绑定的。对于上面的这种形式,可以这样使用bindProperty方法:
bindProperty(text2, "text", this, ["user", "name","text1","text"])。

(0)

相关推荐

  • Flex Data Binding详解

    Data BindIng 什么时候发生: 1.在绑定源属性值发生改变时发生. 2.在绑定源发出initialize事件时绑定发生一次. 让属性具有可绑定功能: 一般的,只要在属性前加上 [Bindable] 或 [Bindable(event="eventname")] 元标记即可 注意: 如果没有标出触发绑定的事件,正如[Bindable],Flex会自动为绑定加上propertyChange事件,当源数据发生变化时,Flex将自动派发该事件,触发数据绑定.如果修改后数据和源数据&q

  • 在Vue mounted方法中使用data变量详解

    如下所示: data: { certificates: null }, mounted: function () { var __this = this; __this.certificates = getDictForkey("学历"); } 使用this对data中变量进行调用 vue生命周期参照官方:点击进入 vue渲染页面的时候,可能会对某些数据进行字典操作,比方性别,数据中是0和1,字典值是男和女,这个时候就需要在mounted进行"性别"字典的获取,然后

  • ThinkPHP CURD方法之data方法详解

    ThinkPHP CURD方法的data方法也是模型类的连贯操作方法之一,用于设置当前要操作的数据对象的值,很多开发人员却并不太习惯用这个方法,今天来讲解下如何用好data方法. 具体用法如下: 1.写操作 通常情况下我们都是通过create方法或者赋值的方式生成数据对象,然后写入数据库,例如: $Model = D('User'); $Model->create(); // 这里略过具体的自动生成和验证判断 $Model->add(); 又或者直接对数据对象赋值,例如: $Model = M

  • flex弹性布局详解

    目录 初了解 基本概念 属性 容器属性(container) flex 项目属性(item属性) 骰子布局实践 初了解 在学习弹性布局之前首先就要明白其概念flex 就是flexible box的缩写,意为弹性布局,用来为盒装模型提供最大的灵活性任何一个容器都可以指定为flex布局 .box{ display: flex; } 行内元素当然也可以使用flex布局 .box{ display: inline-flex; } Webkit 内核的浏览器,必须加上-webkit前缀. .box{ di

  • 详解NodeJS Https HSM双向认证实现

    工作中需要建立一套HSM的HTTPS双向认证通道,即通过硬件加密机(Ukey)进行本地加密运算的HTTPS双向认证,和银行的UKEY认证类似. NodeJS可以利用openSSL的HSM plugin方式实现,但是需要编译C++,太麻烦,作者采用了利用Node Socket接口,纯JS自行实现Https/Http协议的方式实现 具体实现可以参考如下 node-https-hsm TLS规范自然是参考RFC文档 The Transport Layer Security (TLS) Protocol

  • Android Data Binding数据绑定详解

    去年谷歌 I/O大会上介绍了一个非常厉害的新框架DataBinding, 数据绑定框架给我们带来了很大的方便,以前我们可能需要在每个Activity里写很多的findViewById,不仅麻烦,还增加了代码的耦合性,如果我们使用DataBinding,就可以抛弃那么多的findViewById,省时省力.说到这里,其实网上也有很多快速的注解框架,但是注解框架与DataBinding想比还是不好用,而且官网文档说DataBinding还能提高解析XML的速度,其实DataBinding的好用,不仅

  • 详解vue的数据binding绑定原理

    自从angular火了以后,各种mvc框架喷涌而出,angular虽然比较火,但是他的坑还是蛮多的,还有许多性能问题被人们吐槽.比如坑爹的脏检查机制,数据binding是受人喜爱的,脏检查就有点-性能低下了.有时候改了一个地方,脏循环要循环多次来保证数据是不是真的变了和是否停止变化了.这样性能就很低了.于是人们开始钻研新的双向数据binding的方法.尤大的vue binding就是本人蛮喜欢的一种实现方式,本文跟随尤大的一个例子来详解vue的数据binding的原理. 数据binding,一般

  • Hadoop上Data Locality的详解

    Hadoop上Data Locality的详解 Hadoop上的Data Locality是指数据与Mapper任务运行时数据的距离接近程度(Data Locality in Hadoop refers to the"proximity" of the data with respect to the Mapper tasks working on the data.) 1. why data locality is imporant? 当数据集存储在HDFS中时,它被划分为块并存储在

  • Spring Data JPA 简单查询--方法定义规则(详解)

    一.常用规则速查 1 And 并且 2 Or   或 3 Is,Equals 等于 4 Between   两者之间 5 LessThan 小于 6 LessThanEqual   小于等于 7 GreaterThan 大于 8 GreaterThanEqual   大于等于 9 After 之后(时间) > 10 Before 之前(时间) < 11 IsNull 等于Null 12 IsNotNull,NotNull 不等于Null 13 Like 模糊查询.查询件中需要自己加 % 14

  • 详解Spring data 定义默认时间与日期的实例

    详解Spring data 定义默认时间与日期的实例 前言: 需求是这样的: 1. 创建时间与更新时间只能由数据库产生,不允许在实体类中产生,因为每个节点的时间/时区不一定一直.另外防止人为插入自定义时间时间. 2. 插入记录的时候创建默认时间,创建时间不能为空,时间一旦插入不允许日后在实体类中修改. 3. 记录创建后更新日志字段为默认为 null 表示该记录没有被修改过.一旦数据被修改,修改日期字段将记录下最后的修改时间. 4. 甚至你可以通过触发器实现一个history 表,用来记录数据的历

随机推荐