commitProperties中的可绑定vs脏标志

时间:2014-11-17 10:11:01

标签: actionscript-3 flex flex3

将属性绑定到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标签不是首选的性能影响。

有任何想法的人吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

在您的特定轻量级示例中,答案是......没有区别。但这只是因为我知道TextInput.text属性使用第二种方法commitProperties

如果将TextInput.text属性设置为1000次,则只会绘制一次。

并非所有代码都以这种方式运行,即使框架规定了它...它没有强制执行它,有时当你使用绑定设置属性时,它可以启动简单属性集后面的许多其他方法并且不使用commitProperties和无效批处理更新。

编译器为绑定生成的代码也不高效。如果您有移动项目,我会避免绑定。

此外,您还没有绑定到对象和属性(即myObject.myText),而是一个简单的字符串。这是绑定有用的地方。在这种情况下,您的示例会失败,并且需要在myObject属性更改时从myText调度自定义事件。

绑定总是效率低下的,因为生成的代码很冗长,并且不像回调或使用失效那么简单。可以说,从性能的角度来看,使用绑定代替编写一堆代码来完成同样的事情几乎总是可以接受的。

另一个问题是绑定本质上也是静态的。换句话说......它们存在于全局范围内,导致用户界面元素不停地被垃圾收集。一个很好的例子是绑定到itemRenderer中的数据属性,它被循环使用。因此,在项呈示器中使用数据绑定总是总是。您应该覆盖set data(v:Object):void和/或使用commitProperties

记录......我喜欢绑定......我一直都在使用它。你只需要理解:

  1. 表现很差。
  2. 它不遵守Flex的失效模型(即commitProperties
  3. 它发生在全局范围内,可能导致对象挂起。
  4. 如果要查看编译器生成的代码,可以添加编译器选项: -keep-generated-actionscript=true