2011-01-31 101 views
2

的數目我有以下火花應用:的Flex對象創建一倍實例

<?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的兩個實例。

創作序列是這樣的:

  1. 的TestObject構造
  2. TestComponent構造
  3. 的TestObject構造
  4. TestComponent.objects被調用(該參數的值僅包含一個對象)。

如果我實例使用 「元素」 的方式在MXML的TestObject:

<local:TestComponent> 
    <local:objects> 
    <local:TestObject> 
    </local:TestObject> 
    </local:objects> 
</local:TestComponent> 

只有創建的TestObject的一個實例。

任何人都可以解釋爲什麼當使用屬性語法反對元素語法(我認爲是相同的)時創建了兩個對象?

回答

3

這兩種語法絕對不一樣。主要區別在於第一種語法會導致Flex實現綁定,而第二種語法不會。

Flex編譯器採取任何你在花括號放置,並在綁定調用時,它執行的是一個匿名函數把它從字面上。構造函數被調用兩次的具體原因是因爲應用程序啓動時綁定在位於應用程序顯示列表中的UIComponent元素上執行兩次。第一次執行發生在應用程序的構造函數中,其中所有綁定都是最初創建的(在preinitialize事件之前)。綁定的第二次執行發生在創建UIComponent時。 (注意:applicationComplete事件之前可能發生的綁定執行次數會因不同的組件而有所不同,以及您對它們的綁定次數。)

如果要在應用程序初始化中使用綁定,但不創建垃圾,我會推薦類似:

<fx:Declarations> 
    <local:TestObject id="testObject"/> 
</fx:Declations> 

<local:TestComponent objects="{[testObject]}"/> 
+0

非常明確的答案,謝謝。 mx應用程序中的fx:聲明的等價物是什麼? – matb 2011-01-31 14:22:27

相關問題