深入分析Flex [Bindable] (总结)

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

啥是元数据(metadata)

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

啥是绑定

知道继续跳过。举个例子:给下面的public变量加上[Bindable]

[Bindable]
public var name:String = "";

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

能用在哪里

三个地方:类, 变量, 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[i] + "\r\n";
              }
              return _w;
       }
}

原来的设想是content绑定_wholeText,可它是不工作的。为什么?_wholeText太复杂了,被编译器排除在“可能”之外,编译器认为没有绑定关系,如果只是简单的return content,倒是可以的。我这里搜到了一些比较权威的解释。来自http://www.rubenswieringa.com/blog/binding-read-only-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[i] + "\r\n";
              }
              return _w;
       }
}

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

转载于:https://www.cnblogs.com/panjun-Donet/archive/2010/01/08/1642224.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬取IMDBTOP250

在网上看到有人利用pythonbeautifulsoup爬取豆瓣Top250 试着自己模仿这个做了个爬取IMDB的&#xff0c; 可惜只能爬取到11个。 后来检查了超久&#xff0c; 才发现&#xff0c; soupBeautifulSoup(contents)这里&#xff0c;内容不完整&#xff0c;只能到11个电影为止。 代码如…

Vue Video.js播放m3u8视频流格式(video+videojs-contrib-hl)

Vue Video.js播放m3u8视频流格式&#xff08;videovideojs-contrib-hl&#xff09; videojs中文文档详解 Vue.js中this.$nextTick()的使用 videojs画中画小窗口播放问题&#xff1f;

apache mysql python win10_Win10 MySQL-python

在Windows 下调试 Python 还是挺麻烦的.通过PyCharm 来安装个MySQL-python 的库都搞了大半天.分别尝试 1.2.3,1.2.4和1.2.5都有不同的错误.需要解决的问题就是这个:“Cannot open include file: config-win.h: No such file or directory” while installing mysql-python"…

IT宅男们,有没有什么技术让你觉得相见恨晚?

无意中想起SQLite&#xff0c;于是发起了这么一个话题&#xff0c;感谢各位朋友的参与&#xff0c;我把大家的话收集一下&#xff0c;放在这里。 sshg PY算一个吧。当初看了一个下午就决定ditch Perl了。Haskell算另一个吧。看到type class的时候&#xff0c;也是怦然心动。不…

MFC让窗口最前端显示

基于对话框的MFC应用程序&#xff0c;环境&#xff1a;Win XP VC2010。程序界面&#xff1a; 接着为IDC_CHECK1绑定一个BOOL类型的变量m_bShowTopmost&#xff0c;并添加BN_CLICKED事件响应函数&#xff1a; void CWorkHelperDlg::OnBnClickedCheck1() {UpdateData();if(m_bSh…

Request请求:Failed to execute ‘setRequestHeader‘ on ‘XMLHttpRequest‘: String contains non ISO-8859-1 c

Request请求&#xff1a;Failed to execute ‘setRequestHeader’ on ‘XMLHttpRequest’: String contains non ISO-8859-1 code point.问题解决

HDU 1564 找规律博弈

题目大意是&#xff1a; 从n*n的方格角落的一个起点出发&#xff0c;每次移到上下左右一个未曾到达过的位置&#xff0c;谁不能走了谁就输了 想了好久都想不出&#xff0c;看了大神的题解 Orz了 果然博弈不是脑残的游戏啊... 这里从起点出发&#xff0c;将所有方格两两连接&…

庖丁解牛ASP.NET3.5控件和组件开发技术-(1)服务器控件概述

服务器控件概述 1.服务器控件的类型以及ASP.NET控件开发的系统基类 Control,WebControl,CompositeControl,DataBoundControl,HierarchicalDataBoundControl,HierarchichicalDataSourceControl, ListControl,BaseValidator. 2,控件的生命周期&#xff0c; 服务器控件的生命周期与…

gnome硬盘分析_解决八种Linux硬盘问题的技巧

不能在Linux或者类UNIX系统的硬盘上写入数据&#xff1f;想解决服务器上磁盘损坏的问题吗&#xff1f;想知道你为什么总是在屏幕上看到“磁盘已满”的字眼吗&#xff1f;想学习处理这些问题的办法吗&#xff1f;试试一下这8个解决Linux及UNIX服务器硬盘问题的小贴士吧。#1 - 错…

HTML DOM console.table() 方法

HTML DOM console.table() 方法

百度之后,电子银行还安全么?

用户&#xff1a;百度在哪里啊&#xff1f;百度在哪里&#xff1f;***&#xff1a;百度就在小朋友的心里&#xff01;用户&#xff1a;银行在哪里啊&#xff1f;银行在哪里&#xff1f;***&#xff1a;银行就在我家里&#xff0c;这里没有防盗门啦&#xff01;这里没有监控啦。…

利用IDA6.6进行apk dex代码动态调试

网上公开IDA6.6已经有一段时间&#xff0c;这个版本有个好处就是可以动态调试java代码。正好现在需要动态调试&#xff0c;所以顺便练习一下。 根据android的官方文档&#xff0c;如果要调试一个apk里面的dex代码&#xff0c;必须满足以下两个条件中的任何一个&#xff1a; 1.a…

十大经典排序算法python_十大经典排序算法的算法描述和代码实现

这里详细讲解了十大经典算法的分类&#xff0c;例如交换排序、插入排序、选择排序等比较类排序&#xff0c;以及计数排序、桶排序和基数排序的非比较类排序&#xff0c;分析了各种排序算法的复杂度和稳定性&#xff0c;还有JAVA代码的详细实现。对冒泡排序、插入排序、选择排序…

oracle日志查看问题?

From: http://www.iteye.com/problems/34438 假如我在存储过程中有一条dbms_output.put_line(s)语句;当我执行这个存储过程的时候。是否这个打印会存储到系统日志里&#xff1f;如果存储到系统日志里&#xff0c;或者是某个表中。我该怎么查看那&#xff1f; 会存入系统表中.查…

[react] react是哪个公司开发的?

[react] react是哪个公司开发的&#xff1f; facebook 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

js执行shell命令的几种方式(Node)

js执行shell命令的几种方式&#xff08;Node&#xff09; nodejs 执行cmd或shell命令 Nodejs调用shell脚本 nodejs调用shell

换了一块硬盘

不知不觉T400的小黑已经伴我走过了一年的时间&#xff0c;终于今天要给它换一块比较快的硬盘&#xff0c;7200.4希捷笔记本硬盘&#xff0c;下面是测试的数据 在网络查了下&#xff0c;好像性能还不错&#xff0c;只是显卡性能一般了一些。。。

Linux系统安装Nodejs

Linux系统安装Nodejs

模态对话框与非模态对话的几种销毁方法与区别

From: http://renjwjx.blog.51cto.com/811549/191320/ 前几天发现自己的程序中使用非模态对话框&#xff0c;Debug版本有警告提示如下&#xff1a; Warning: calling DestroyWindow in CWnd::~CWnd OnDestroy or PostNcDestroy in derived class will not be called 由于是Warn…

处理问题的方式

1. 测试代码的时候&#xff0c;如果某段代码效率特别差&#xff0c;可以通过注释部分代码的方式以确定问题代码的位置。测试的时候一定保证只有一部分代码在执行&#xff0c;排除其他干扰。 2. 日志记录&#xff1a; 1). 要有详细的日志记录&#xff0c;方便出错时查找。 2). 在…