【问题标题】:Flex object creation double the number of instancesFlex 对象创建实例数翻倍
【发布时间】:2011-01-31 17:32:53
【问题描述】:

我有以下火花应用程序:

<?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 实例。

任何人都可以解释为什么使用属性语法而不是元素语法(我认为是相同的)时创建了两个对象?

【问题讨论】:

    标签: apache-flex actionscript-3


    【解决方案1】:

    这两种语法肯定不一样。主要区别在于第一种语法会导致 Flex 实现绑定,而第二种则不会。

    Flex 编译器将您放在波浪形括号中的任何内容放入一个匿名函数中,绑定在执行时调用该函数。构造函数被调用两次的具体原因是因为在应用程序启动时,绑定在位于应用程序显示列表中的 UIComponent 元素上执行了两次。第一次执行发生在应用程序的构造函数中,最初创建所有绑定(在preinitialize 事件之前)。绑定的第二次执行发生在创建 UIComponent 时。 (注意:applicationComplete 事件之前可能发生的绑定执行次数会因不同的组件以及您对它们的绑定而有所不同。)

    如果你想使用绑定,而不是在应用程序初始化中创建垃圾,我建议你这样做:

    <fx:Declarations>
        <local:TestObject id="testObject"/>
    </fx:Declations>
    
    <local:TestComponent objects="{[testObject]}"/>
    

    【讨论】:

    • 非常明确的答案,谢谢。 mx 应用程序中的 fx:declaration 等价物是什么?
    • @matb - 实际上没有。非显示组件必须嵌套在声明块中的限制是 Flex 4 框架中引入的约定。在 MX 中,您可以省略 Declarations 标签。这有点像过去您可以将普通大小的牙膏管放在随身行李中 - 现在您必须将它放在托运行李中。 ;)
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2012-11-08
    • 2013-10-20
    相关资源
    最近更新 更多