我有以下火花应用程序:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955"
minHeight="600" xmlns:local="*">
<local:TestComponent objects="{[new TestObject()]}">
</local:TestComponent>
</s:Application>
TestComponent:
package
{
import mx.core.UIComponent;
public class TestComponent extends UIComponent
{
public function TestComponent()
{}
public function set objects(array:Array):void
{}
}
}
的TestObject:
package
{
public class TestObject
{
public function TestObject()
{}
public function set objs(value:Array): void
{}
}
}
我观察到TestObject的构造函数被调用了2次,并且创建了两个TestObject实例。
创建顺序如下:
如果我使用mxml中的“element”方式实例化TestObject:
<local:TestComponent>
<local:objects>
<local:TestObject>
</local:TestObject>
</local:objects>
</local:TestComponent>
只创建了一个TestObject实例。
任何人都可以解释为什么在使用属性语法时会创建两个对象而不是元素语法(我认为是相同的)?
答案 0 :(得分:3)
两种语法肯定不一样。主要区别在于第一种语法会导致Flex实现绑定,而第二种语法则不会。
Flex编译器将你在squiggly括号中放置的任何东西都放在一个匿名函数中,绑定在执行时调用它。构造函数被调用两次的具体原因是因为应用程序启动时,应用程序的显示列表中的UIComponent元素执行了两次绑定。第一次执行发生在Application的构造函数中,其中最初创建所有绑定(在preinitialize
事件之前)。第二次执行绑定时会在创建UIComponent时发生。 (注意:applicationComplete
事件之前可能发生的绑定执行次数因不同组件而异,以及与它们绑定的内容。)
如果你想在应用程序初始化中使用绑定但不创建垃圾,我建议使用以下内容:
<fx:Declarations>
<local:TestObject id="testObject"/>
</fx:Declations>
<local:TestComponent objects="{[testObject]}"/>