在ActionScript中复制复杂的MXML绑定

时间:2020-03-06 14:26:08  来源:igfitidea点击:

MXML使我们可以执行一些非常强大的数据绑定,例如:

<mx:Button id="myBtn" label="Buy an {itemName}" visible="{itemName!=null}"/>

我发现BindingUtils类可以将值绑定到简单属性,但是上面的绑定都没有这样做。是否可以在AS3代码中执行相同的操作,还是Flex可以通过我的MXML静默生成多行代码?
任何人都可以从纯AS3中复制上述内容,从以下位置开始:

var myBtn:Button = new Button();
myBtn.id="myBtn";
???

解决方案

我相信flex会产生一个小的匿名函数来处理这个问题。

我们可以使用ChangeWatcher进行类似的操作。我们甚至可以在changewatcher调用中创建一个新的匿名函数。

做到这一点的方法是使用bindSetter。当示例中的MXML在编译之前转换为ActionScript时,这也是在后台完成的。

// assuming the itemName property is defined on this:
BindingUtils.bindSetter(itemNameChanged, this, ["itemName"]);

// ...

private function itemNameChanged( newValue : String ) : void {
  myBtn.label   = newValue;
  myBtn.visible = newValue != null;
}

...除了将MXML转换为ActionScript所生成的代码更长之外,因为它必须更通用。在此示例中,它可能会生成两个函数,每个绑定表达式一个。

我们还可以通过在编译器设置中添加-keep参数来查看flex编译mxml文件时生成的自动生成的代码。我们可以通过选择项目属性并查看" Flex Compiler"选项,然后在"其他编译器参数"下找到设置,将" -keep"添加到已存在的内容中。

完成后,Flex将在源文件夹中创建一个"已生成"目录,我们将在其中找到所有临时文件,这些文件都是编译期间使用的文件。