深入分析FlexBindable及使用方法

在学习Flex的过程中,你可能会遇到Flex[Bindable]方面的问题,这里和大家分享一下,希望本文的介绍能让你有所收获。

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

◆Flex[Bindable]大概又是Flex用得最多的元数据了。刚开始用用确实好简单,效率真是没的说。不过这几天用着却碰到了些问题,我自己搜集了些资料,想着有必要在blog里总结一下吧。
啥是元数据(metadata)

今天不晓得为什么livedoc.adobe.com这么慢,没办法,拿不到权威的解释了。我就按自己的理解随便解释一下:首先要明白元数据不是语法的一部分,而是专门给编译器用的,说白了是告诉编译器做某些事情,学过java之类的应该知道。那Bindable来讲,它的作用是告诉flex编译器,给某些某些东西建立绑定关系,flex编译器会在编译过程中给AS(flex编译器就是把mxml编译成as,再编译到swf,也可能直接编译倒swf,我这里假设有as这么个环节)加一点事件发生和处理之类的代码,由此绑定的关系便建立了,如果我们用纯粹as3代码来写也是可以实现的,就是太太太麻烦。

举个例子:给下面的public变量加上Flex[Bindable]

  1. Flex[Bindable]  
  2. publicvarname:String=""

◆作为一个public变量,肯定既可以被赋值,也能赋值给别的变量。绑定的作用就是,当name改变的时候(被赋值了),可能通知其它被name影响(赋值给它们)的变量发生改变。这里的“可能”就需要编译器来判断,这就是为什么元数据是给编译器用的原因了。在mxml里用{}的语法的地方就是绑定的对象,比如label={xxx.name},当name变化,label也跟着变化。这样,我们只是很简单的改变了name的值,由于有绑定,界面上的label也跟着自动变化了,爽吧。
能用在哪里

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

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

  1. Flex[Bindable]  
  2. privatevarcontent:Array=newArray();  
  3. Flex[Bindable]  
  4. publicfunctionset_content(ct:String):void  
  5. {  
  6. content=ct.split(SEP);  
  7. }  
  8. Flex[Bindable]  
  9. publicfunctionget_wholeText():String  
  10. {  
  11. if(content.length==0)  
  12. {  
  13. return"";  
  14. }  
  15. else  
  16. {  
  17. var_w:String="";  
  18. for(vari:int=0;i<content.length;i++)  
  19. {  
  20. _w+=content[i]+"\r\n";  
  21. }  
  22. return_w;  
  23. }  
  24. }  
  25.  

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

  1. Nowkeepinmindthatthere’snowayforthecompilertoactuallytellifthevalueofapropertygetfunctionwouldbedifferentifcalled,  
  2. shortofdoinganextensivecodeflowanalysisofthegetfunction,  
  3. identifyingalltheinputsthatmightbeaffectingthevalueofthegetfunction  
  4. (i.e.,memberfields,statics,globalsthatareusedinthegetfunctionandinanymethods,globalfunctions,closures,etc)itmightcall,
  5. andsettingupwatchersoneveryoneofthosetotriggerthebindingwhenanyofthemchange.  
  6. That’sprohibitivelydifficult,andexpensivetodo.Sothecompilerdoesn’ttry.  
  7.  
  8. InsteadwhenyouputFlex[Bindable]onaget/setproperty,  
  9.  
  10. thecompilermakesitbindablewithalittlecreativerewritingthatallowstheframeworktowatchthegetfunction,  
  11. anddispatchachangeeventwhenthegetfunctionistriggered.Thismeansthatautomaticbindablepropertiesdon’  
  12. tworkwhenthegetfunctioniscomputedfrommultiplevalues,  
  13. orwhenyouchangeitsvaluebysettingabackingfield,ratherthanusingthesetfunction.  
  14.  
  15. It_also_meansthatifyouhavenosetfunction,  
  16.  
  17. wecanprettymuchguaranteethatthere’snowayautomaticallybindablegetpropertieswillbetriggered.areadonlypropeertyis,  
  18. tothecompiler,completelyopaque…atthemoment,ithasnoideawherethatvalueiscomingfrom,  
  19. andhencewillneverbeableto‘automatically’triggerthebinding.  

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

  1. Flex[Bindable]  
  2. privatevarcontent:Array=newArray();  
  3. Flex[Bindable]  
  4. publicfunctionset_content(ct:String):void  
  5. {  
  6. content=ct.split(SEP);  
  7. this.dispatchEvent(newEvent("_contectChanged"));  
  8. }  
  9. [Bindable("_contectChanged")]  
  10. publicfunctionget_wholeText():String  
  11. {  
  12. if(content.length==0)  
  13. {  
  14. return"";  
  15. }  
  16. else  
  17. {  
  18. var_w:String="";  
  19. for(vari:int=0;i<content.length;i++)  
  20. {  
  21. _w+=content[i]+"\r\n";  
  22. }  
  23. return_w;  
  24. }  
  25. }  
  26.  

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

更多相关文章
  •  为了提升账户管理的便捷和安全性,公司在本人的建议下决定从NIS升级到LDAP.研究了2个星期,终于完成了LDAP服务器的搭建,并和SVN整合了起来.期间查找了很多资料,但多半无用,居然没有一个文档是可以完整搭建成功的.一时感慨,资料泛滥的年代,能找出几个像样的还真不容易.因此,贴出最近搭建的完整步 ...
  • 一切要从ebay的买家保护说起 ebay作为一个电子商务平台,之所以可以汇聚如此众多的全球商家和买家,就是因为其良好的信用,不同于淘宝,在ebay上,即便你是个"崭新"的卖家,一个销售记录都没有,同样可以很快的开始你的生意(在淘宝上,不炒信用,从零开始几乎是不可能了),其原因就在 ...
  • 1. 下载 Windows Technical Preview 下载地址: http://windows.microsoft.com/zh-cn/windows/preview-iso 产品密钥: NKJFK-GPHP7-G8C3J-P6JXR-HQRJR 系统要求 基本上,如果你的电脑可以运行 W ...
  • 在经历了这段时间的使用之后,你安装了Windows 10的系统盘是否已经变得有点拥挤了呢?以下便是Windows 10当中集中最简单的硬盘清理方式. 清空回收站 长久以来,回收站一直是Windows系统当中未曾改变的元素.Windows 10依然会使用回收站来隐藏你想要扔掉的所有文件,而将其清空之后 ...
  • 线性离散化DP...表示不会..如果直接用数组存放会爆掉内存的..所以用map. DP[i][j]是以第i个指针为结束的最小公倍数j的方案数. typedef    map<LL,LL>mp;     第一个表示第i个指针为结束的最小公倍数j,第二个为以第i个指针为结束的最小公倍数j的方 ...
  • 写法1:   public User queryUserByUsername(String username); 写法2:   public User queryUserByUsername(@Param(value="username") String username);   ...
一周排行
  • SharpPcap 是一个.NET 环境下的网络包捕获框架,基于著名的 pcap/WinPcap 库开发.提供了捕获.注入.分析和构建的功能,SharpPcap 还是一个跨平台的库,可以在Mono/.NET下运行,详 ...
  • 描述:为了反映站点数据的变化,通常需要页面进行自动刷新.刷新结果可以是当前页面,也可以转换到指定页面. 实现代码: <meta http-equiv="refresh" content=&q ...
  • 存在文件包含的站点: http://diy.91.com 对http://diy.91.com/login.php 测试,无果. 通过目录遍历得到: diy.91.com/tools/log/ post:logtyp ...
  • 181.微机突然断电,此时微机______中的信息全部丢失,恢复供电后也无法恢复这些信息. A.软盘 B.RAM C.硬盘 D.ROM 答案:(B.) 评析:计算机的存储器分为:内储存器和外存储器.内存储器是计算机主 ...
  • 三峡晚报讯 网络截图.记者李娅 摄 昨日上午,"宜昌三峡水务公司"网站被黑客袭击,使得网页在数小时内竟然成为了黄色网页.据宜昌三峡水务公司技术中心工作人员表示,该网站可能是被黑客攻击了. 这已是该 ...
  • Ubuntu + Android Studio环境,更新Android 4.4W之后,Android Studio的布局加载器发生异常,渲染图形失败.错误信息如下: Rendering Problems There ...
  • 小记:本人是PHPer,对C#.NET的开发只能说看得懂,也写得了功能略简单的PC客户端程序,下面的是本人开发一款名叫“理财速记”的PC客户端软件的全过程记录,期间包括比较繁琐的C#.NET资料查询等学习过程描述,适 ...
  • 在开发建设网站的过程中,也许我们会遇到这样的情况,当我们的网站已经进行了相当一部分,却发现还需要对某些细节进行修改 在开发建设网站的过程中,也许我们会遇到这样的情况,当我们的网站已经进行了相当一部分,却发现还需要对某 ...
  • 当62岁的张瑞敏开始谈起Facebook和长尾理论,你可以想见这位中国企业家中的管理教父内心是何等焦虑,他对于新成功的渴望又是多么强烈.张瑞敏正在努力做一件事--试图为海尔这家年销售额过千亿的家电航母注入新的基因.这 ...
  • 为API生,为框架死,为了bug奋斗一辈子,吃符号亏,上大小写的当,最后死在需求上. --摘自程序员语录 试想一下,我们当中的谁能够每天连续工作八小时只会专心一意的做一件事情,你也知道能够做到这个样子是有多难,但是对 ...