读书人

[转载]Flex中[Bindable]的施用心得

发布时间: 2012-11-20 09:55:43 作者: rapoo

[转载]Flex中[Bindable]的使用心得

在Flex编程中,Bindble使用到最多的元数据。该标签可以应用在变量或者类或者方法上。同在在MXML中使用”{}”引用设置为Bindable的变量,从而实现对于变量赋值与界面元素的自动同步。

Bindable的实现采用了GoF的Observer模式,或者Publisher/Subscriber模式。该实现允许一个类(或者变量)可以将自身的变化自动通知给感兴趣的对象。

对应Observer模式,GoF的说法是:

定义对象间的一种一对多的依赖关系,当一个对象状态发生改变的时候,所有依赖于他的对象都得到通知并被自动更新。这种交互也成为发布-订阅。目标是通知的发布者。他发布通知是不需要知道谁是他的订阅者(观察者)。可以有任意数目的观察着订阅并接受通知。

在ActionScript中,编译器将会为该标签给特定的属性或类或者方法的变化增加事件关联。

简单的例子,如果定义了变量和一个组件:

[Bindable] var displayName :String;<mx:TextInput id= "textA" text="{dispayName}"/>,

编译器在后台自动增加事件对应伪代码如下:

function set DispayName(newvar :String) :void{    displayName= newvar;    this.dispatchEvent(new Event("_dispayNameChanged"));}// 类型初始化时被调用function MxmlInit(){
    textA.addEventListener("_dispayNameChanged")) , UpdateDisplay);}function UpdateDisplay(){    textA.text = displayName;}

可见,编译器在背后做了大量的工作,为我们节省了很多的重复劳动来建立这种观察关系。

对于初学Flex的人,对于bindable的误解往往是认为Bindable是双向的数值链接,事实上Observer模式对应的一个要素就是被观察者对观察者一无所知。

比如上面的例子,对于textA的修改,其值并不会自动的体现在displayName上。Bindable只是建立单项的观察者的关系,这一点至关重要。

对应MVC架构中,被观察者往往对应Model(数据模型?)的角色,而观察者则对应于View(视图)的角色,事实上很多的MVC架构也是非常依赖于Bindable这个工具。

那么什么情况下应该应用Bindable?Leaf的个人经验和理解是:

读书人网 >flex

热点推荐