我有以下 Spark 应用程序:
<?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>
测试组件:
package
{
import mx.core.UIComponent;
public class TestComponent extends UIComponent
{
public function TestComponent()
{}
public function set objects(array:Array):void
{}
}
}
测试对象:
package
{
public class TestObject
{
public function TestObject()
{}
public function set objs(value:Array): void
{}
}
}
我观察到 TestObject 的构造函数被调用了 2 次,并且创建了两个 TestObject 实例。
创建顺序如下:
- TestObject 构造函数
- TestComponent 构造函数
- TestObject 构造函数
- 调用TestComponent.objects(参数值仅包含一个对象)。
如果我在mxml中使用“元素”方式实例化TestObject:
<local:TestComponent>
<local:objects>
<local:TestObject>
</local:TestObject>
</local:objects>
</local:TestComponent>
仅创建一个 TestObject 实例。
任何人都可以解释为什么使用属性语法而不是元素语法(我认为是相同的)时创建两个对象?
最佳答案
这两个语法肯定不一样。主要区别在于第一个语法将导致 Flex 实现绑定(bind),而第二个语法则不会。
Flex 编译器会将您放置在波形括号中的任何内容直接放入匿名函数中,绑定(bind)在执行时会调用该函数。构造函数被调用两次的具体原因是,当应用程序启动时,绑定(bind)在位于应用程序显示列表中的 UIComponent 元素上执行了两次。第一次执行发生在应用程序的构造函数中,所有绑定(bind)都是最初创建的(在 preinitialize
事件之前)。绑定(bind)的第二次执行发生在创建 UIComponent 时。 (注意:在 applicationComplete
事件之前可能发生的绑定(bind)执行次数因不同的组件以及您对它们的绑定(bind)而异。)
如果您想使用绑定(bind),但不想在应用程序初始化中创建垃圾,我建议您使用以下内容:
<fx:Declarations>
<local:TestObject id="testObject"/>
</fx:Declations>
<local:TestComponent objects="{[testObject]}"/>
关于apache-flex - Flex 对象创建实例数量加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4847243/