将属性绑定到Flex中的组件的最佳方法是什么?
假设我必须更新TextArea的文本字段。我们可以通过两种方式实现:
1
AS3:
[Bindable]
private var myText:String;
//setters getters
MXML:
<mx:TextArea id="description" text="{myText}"/>
2
AS3
private var myText:String;
private var myTextChanged:Boolean;
public set myText(pText: String): void
{
if (myText != pText)
{
myText = pText;
myTextChanged = true;
invalidateProperties();
}}
override protected function commitProperties():void
{
//other code
if (myTextChanged)
{
description.text = myText;
myTextChanged = false;
}
MXML
<mx:TextArea id="description"/>
AFAIK,第二种方式是干净的,但有很多代码和额外的变量(脏标志)。但我不确定第一种方式,因为我认为Bindable标签不是首选的性能影响。
有任何想法的人吗?
提前致谢。
答案 0 :(得分:2)
在您的特定轻量级示例中,答案是......没有区别。但这只是因为我知道TextInput.text
属性使用第二种方法commitProperties
。
如果将TextInput.text属性设置为1000次,则只会绘制一次。
并非所有代码都以这种方式运行,即使框架规定了它...它没有强制执行它,有时当你使用绑定设置属性时,它可以启动简单属性集后面的许多其他方法并且不使用commitProperties
和无效批处理更新。
编译器为绑定生成的代码也不高效。如果您有移动项目,我会避免绑定。
此外,您还没有绑定到对象和属性(即myObject.myText
),而是一个简单的字符串。这是绑定有用的地方。在这种情况下,您的示例会失败,并且需要在myObject
属性更改时从myText
调度自定义事件。
绑定总是效率低下的,因为生成的代码很冗长,并且不像回调或使用失效那么简单。可以说,从性能的角度来看,使用绑定代替编写一堆代码来完成同样的事情几乎总是可以接受的。
另一个问题是绑定本质上也是静态的。换句话说......它们存在于全局范围内,导致用户界面元素不停地被垃圾收集。一个很好的例子是绑定到itemRenderer中的数据属性,它被循环使用。因此,在项呈示器中使用数据绑定总是总是。您应该覆盖set data(v:Object):void
和/或使用commitProperties
。
记录......我喜欢绑定......我一直都在使用它。你只需要理解:
commitProperties
)如果要查看编译器生成的代码,可以添加编译器选项:
-keep-generated-actionscript=true