深入分析Flex[Bindable]及使用方法
2010年09月20日
在学习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] ◆作为一个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很像方法,用起来会有点不同。看看这个例子: ◆原来的设想是content绑定_wholeText,可它是不工作的。为什么?_wholeText太复杂了,被编译器排除在"可能"之外,编译器认为没有绑定关系,如果只是简单的returncontent,倒是可以的。我这里搜到了一些比较权威的解释。来自http://www.rubenswieringa.com/blog/binding-read-on ly-accessors-in-flex找到ElyGreenfield讲的。 Nowkeepinmindthatthere'snowayforthecompilertoactua llytellifthevalueofapropertygetfunctionwouldbediffe rentifcalled,
shortofdoinganextensivecodeflowanalysisofthegetfun ction,
identifyingalltheinputsthatmightbeaffectingthevalu eofthegetfunction
(i.e.,memberfields,statics,globalsthatareusedinthe getfunctionandinanymethods,globalfunctions,closures ,etc)itmightcall,
andsettingupwatchersoneveryoneofthosetotriggertheb indingwhenanyofthemchange.
That'sprohibitivelydifficult,andexpensivetodo.Soth ecompilerdoesn'ttry.
InsteadwhenyouputFlex[Bindable]onaget/setproperty,
thecompilermakesitbindablewithalittlecreativerewri tingthatallowstheframeworktowatchthegetfunction,
anddispatchachangeeventwhenthegetfunctionistrigger ed.Thismeansthatautomaticbindablepropertiesdon'
tworkwhenthegetfunctioniscomputedfrommultiplevalue s,
orwhenyouchangeitsvaluebysettingabackingfield,rath erthanusingthesetfunction.
It_also_meansthatifyouhavenosetfunction,
wecanprettymuchguaranteethatthere'snowayautomatica llybindablegetpropertieswillbetriggered.areadonlypr opeertyis,
tothecompiler,completelyopaque…atthemoment, ithasnoideawherethatvalueiscomingfrom,
andhencewillneverbeableto'automatically'triggerthe binding.
说白了就是为了降低复杂度和提高效率,复杂情况的getter会被忽略。如何解决?可以手动建立绑定,即[Bindable("eventName")]。把代码改成这样: Flex[Bindable]
privatevarcontent:Array=newArray();
Flex[Bindable]
publicfunctionset_content(ct:String):void
{
content=ct.split(SEP);
this.dispatchEvent(newEvent("_contectChanged"));
}
[Bindable("_contectChanged")]
publicfunctionget_wholeText():String
{
if(content.length==0) {
return"";
} else {
var_w:String="";
for(vari:int=0;iflex为用户隐藏了很多底层算法。
2010年09月20日
在学习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] ◆作为一个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很像方法,用起来会有点不同。看看这个例子: ◆原来的设想是content绑定_wholeText,可它是不工作的。为什么?_wholeText太复杂了,被编译器排除在"可能"之外,编译器认为没有绑定关系,如果只是简单的returncontent,倒是可以的。我这里搜到了一些比较权威的解释。来自http://www.rubenswieringa.com/blog/binding-read-on ly-accessors-in-flex找到ElyGreenfield讲的。 Nowkeepinmindthatthere'snowayforthecompilertoactua llytellifthevalueofapropertygetfunctionwouldbediffe rentifcalled,
shortofdoinganextensivecodeflowanalysisofthegetfun ction,
identifyingalltheinputsthatmightbeaffectingthevalu eofthegetfunction
(i.e.,memberfields,statics,globalsthatareusedinthe getfunctionandinanymethods,globalfunctions,closures ,etc)itmightcall,
andsettingupwatchersoneveryoneofthosetotriggertheb indingwhenanyofthemchange.
That'sprohibitivelydifficult,andexpensivetodo.Soth ecompilerdoesn'ttry.
InsteadwhenyouputFlex[Bindable]onaget/setproperty,
thecompilermakesitbindablewithalittlecreativerewri tingthatallowstheframeworktowatchthegetfunction,
anddispatchachangeeventwhenthegetfunctionistrigger ed.Thismeansthatautomaticbindablepropertiesdon'
tworkwhenthegetfunctioniscomputedfrommultiplevalue s,
orwhenyouchangeitsvaluebysettingabackingfield,rath erthanusingthesetfunction.
It_also_meansthatifyouhavenosetfunction,
wecanprettymuchguaranteethatthere'snowayautomatica llybindablegetpropertieswillbetriggered.areadonlypr opeertyis,
tothecompiler,completelyopaque…atthemoment, ithasnoideawherethatvalueiscomingfrom,
andhencewillneverbeableto'automatically'triggerthe binding.
说白了就是为了降低复杂度和提高效率,复杂情况的getter会被忽略。如何解决?可以手动建立绑定,即[Bindable("eventName")]。把代码改成这样: Flex[Bindable]
privatevarcontent:Array=newArray();
Flex[Bindable]
publicfunctionset_content(ct:String):void
{
content=ct.split(SEP);
this.dispatchEvent(newEvent("_contectChanged"));
}
[Bindable("_contectChanged")]
publicfunctionget_wholeText():String
{
if(content.length==0) {
return"";
} else {
var_w:String="";
for(vari:int=0;iflex为用户隐藏了很多底层算法。