apache-flex - Flex 对象创建实例数量加倍

标签 apache-flex actionscript-3

我有以下 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 实例。

创建顺序如下:

  1. TestObject 构造函数
  2. TestComponent 构造函数
  3. TestObject 构造函数
  4. 调用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/

相关文章:

c++ - Flex -- C++ 连接?

java - Flex+JPA/Hibernate+BlazeDS+MySQL这个怪物怎么调试?

actionscript-3 - 如何立即获取不同帧的电影剪辑的宽度?

flash - Flex - ExternalInterface.Call() 总是返回 'Undefined'

apache-flex - 垂直ButtonBar按钮的宽度

javascript - 您可以采用 Javascript 库并在 Flash 中运行它吗?

flash - 错误的证书名称导致 Adob​​e Flash 电影中的安全沙箱冲突错误

java - flash.display.Loader 间歇性地导致加载的 swf 的子项松散类型

actionscript-3 - 获取对方法调用者的引用的通用方法?

apache-flex - 数据绑定(bind)将无法检测到 "topLevelApplication"的分配