Bindable Flex中Bindable的原理

原创 2012年03月22日 06:52:16
 [Bindable]        private var bind_String:String="hi";

    [Bindable(event="propertyChange")]
         private var bind_String:String="hi";
         
         private function onChange():void
         {
              var oldValue:String = bind_String;
              bind_String = "hello";
             if(bind_String!==oldValue) {
                 this.dispatchEvent(PropertyChangeEvent.createUpdateEvent(this,
                 "bind_String", oldValue, bind_String));
             }
         }

能用在哪里
三个地方:类, 变量, getter/setter。是不是public没有关系,private的就只能给自家用呗。用在Class上就是简单的给所有的public属性(包括变量,getter/setter,普通方法)加上[Bindable],可是一般的方法不能用[Bindable]呀,于是一般就能看到flex给了个warning,直接无视。变量嘛就是上面讲的,很简单略掉。

用在只读,只写属性(getter/setter)上面

终于讲到关键地方了,因为getter和setter很像方法,用起来会有点不同。看看这个例子:

[Bindable]
private var content:Array = new Array();
[Bindable]
public function set _content(ct:String):void
{
        content = ct.split(SEP);
}
[Bindable]               
public function get _wholeText():String
{
        if(content.length == 0)
        {
                return "";
        }
        else
        {
                var _w:String = "";
                for(var i:int=0 ; i<content.length ; i++)
                {
                        _w += content + "\r\n";
                }
                return _w;
        }
}

原来的设想是content绑定_wholeText,可它是不工作的。为什么?_wholeText太复杂了,被编译器排除在“可能”之外,编译器认为没有绑定关系,如果只是简单的return content,倒是可以的。我这里搜到了一些比较权威的解释。来自http://www.rubenswieringa.com/bl ... y-accessors-in-flex找到Ely Greenfield讲的。

    Now keep in mind that there’s no way for the compiler to actually tell if the value of a property get function would be different if called, short of doing an extensive code flow analysis of the get function, identifying all the inputs that might be affecting the value of the get function (i.e., member fields, statics, globals that are used in the get function and in any methods, global functions, closures, etc) it might call, and setting up watchers on every one of those to trigger the binding when any of them change. That’s prohibitively difficult, and expensive to do. So the compiler doesn’t try.

    Instead when you put [Bindable] on a get/set property, the compiler makes it bindable with a little creative rewriting that allows the framework to watch the get function, and dispatch a change event when the get function is triggered. This means that automatic bindable properties don’t work when the get function is computed from multiple values, or when you change its value by setting a backing field, rather than using the set function.

    It _also_ means that if you have no set function, we can pretty much guarantee that there’s no way automatically bindable get properties will be triggered. a read only propeerty is, to the compiler, completely opaque…at the moment, it has no idea where that value is coming from, and hence will never be able to ‘automatically’ trigger the binding.

说白了就是为了降低复杂度和提高效率,复杂情况的getter会被忽略。如何解决?可以手动建立绑定,即[Bindable("eventName")]。把代码改成这样:

[Bindable]
private var content:Array = new Array();
[Bindable]
public function set _content(ct:String):void
{
        content = ct.split(SEP);
        this.dispatchEvent(new Event("_contectChanged"));
}
[Bindable("_contectChanged")]               
public function get _wholeText():String
{
        if(content.length == 0)
        {
                return "";
        }
        else
        {
                var _w:String = "";
                for(var i:int=0 ; i<content.length ; i++)
                {
                        _w += content + "\r\n";
                }
                return _w;
        }
}

这样就避免了编译器去自动识别。自己加上绑定关系,当_content被赋值,发出_contentChanged事件,通知所有被绑定的getter方法执行一遍。这也说明了,绑定不过是事件游戏而已,flex为用户隐藏了很多底层算法。



绑定表达式或绑定的函数里抛出的异常和错误,被绑定框架所捕获,这种叫无声捕获。最终导致的结果就是,你通过Flash Player的debug版本去调试程序时,不能在运行时看到异常信息。不仅绑定功能没有工作,连错误都没显示出来。为什么会有这种无声捕获呢?在绑定情景出现前,代码需要满足绑定机制所必须的条件。绑定机制可以吞咽任何错误以阻止在运行时抛出异常信息。这样可以避免出现哪些不必要的错误提示信息。BindingManager.debugBinding("label.text")

实现了IPropertyChangeNotifier接口的类,当类的属性发生改变时,都会派发事件。举个例子,你可以查看UIComponent 类的代码。实际上UIComponent 类实现了,当属性一旦改变都会派发dispatchPropertyCangeEvent事件。

你可以通过给UserIfno类添加一个[Bindable]标签来解决绑定不工作的问题。这样就可以确保这个类的公有属性都可以被绑定。Flex编译器会生成相应的一对公有的getter和setter构造器,来确保它们满足绑定机制的要求。或者,若不希望所有属性可被绑定,可以将[Bindable]标签添加到类的指定属性上。

但是,有一些类的属性或变量,比如简单的变量,它们不能使用[Bindable]标签,也不能实现必要的接口。也就是说,这个类属于你创建的,你可以添加[Bindable]来轻松实现绑定的功能;但若这个类不属于你,而你又想实现绑定的功能,这时你就可以考虑使用ObjectProxy类。ObjectProxy 类包装一个非绑定类和一个属性改变就会派发的PropertyChangeEvent事件

在一个大量使用[Bindable]属性的类中,这个过程是很占用内存的。防治过度binding,忘记取消绑定或导致内存泄露


你要定义自己的常量以免造成过多的内存浪费。将一个静态常量赋值给事件的名称,并使用相同的值去派发事件。但是,当number值改变时,绑定没有工作。原因是事件的名称是EVENT_CHANGED_CONST,而不是这个常量的值。

一个普遍的错误是在绑定时,假定绑定的发生是按照一定的顺序来发生。这样可能导致你的程序发生警告提示和绑定不起作用。ActionScript中的事件是异步执行的方式。

双向绑定不起作用的原因在于源和目标对象的属性必须支持绑定,而且能够支持读和写的操作,只有这样才能支持双向绑定。

总之,数据绑定是Flex的很大的优点,但它也存在潜在的缺点。我建议在使用数据绑定时,你要花时间考虑该绑定是不是必须的,使用得是不是完全正确。滥用或误用会带来

内存的消耗,影响程序的性能。

http://blog.csdn.net/lixuekun820/article/details/5492697 经典


相关文章推荐

Flex中[Bindable]的用法。

转载自网友的一篇关于[Bindable]用法的文章:什么是元数据(metadata):[Bindable]大概又是Flex用得最多的元数据了。我就按自己的理解随便解释一下:首先要明白元数据不是语法的一...
  • lichkui
  • lichkui
  • 2009年10月20日 17:58
  • 4675

Flex中[Bindable]的使用心得

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

flex之[Bindable]

[Bindable]的作用,就是引用此变量的地方,也会跟着变。 没有[Bindable]时,代码: ...

Flex中[Bindable]的使用心得

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

Flex中的Bindable的用法

Flex中的Bindable的用法     虽然多数Flex开发者都使用过[Bindable]标签,但是很多人都不知道这个标签的作用甚至不知道该标签为何物。[Bi...
  • gbanana
  • gbanana
  • 2010年10月28日 16:47
  • 521

Flex 学习总结 -- Bindable的原理

[Bindable]:元数据标签,它在代码中的作用就是向编译器提供如何编译程序的信息。它的最大作用是使程序组件间的数据同步变得容易。在开发中通常用上Bindable作用在视图控件上,如给它绑定一个对象...
  • wwbmyos
  • wwbmyos
  • 2011年11月16日 15:54
  • 776

Flex Bindable的用法

什么是元数据(metadata):[Bindable]大概又是Flex用得最多的元数据了。 我就按自己的理解随便解释一下:首先要明白元数据不是语法的一部分,而是专门给编译器用的,说白了是告诉编译器做...
  • cca313
  • cca313
  • 2011年12月20日 14:45
  • 490

Flex中Event与Bindable

Event: 1.事件派发 Dispatching Flash.events.EventDispacher类提供了事件dispatch函数,如果需要dispatch事件,则应该考虑继承该类或其子类...

Flex中的Bindable等元数据标签的用法

虽然多数Flex开发者都使用过[Bindable]标签,但是很多人都不知道这个标签的作用甚至不知道该标签为何物。[Bindable]就是所谓的元数据标签。元数据标签是一种特殊的标签,它在代码中的作用就...
  • wpz0713
  • wpz0713
  • 2014年12月27日 13:40
  • 354

深入分析Flex [Bindable] 以及使用方法

转自:http://gain-loss.org/?p=71[Bindable]大概又是Flex用得最多的元数据 了。刚开始用用确实好简单,效率真是没的说。不过这几天用着却碰到了些问题,我自己搜集了些...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bindable Flex中Bindable的原理
举报原因:
原因补充:

(最多只允许输入30个字)