2009-08-31 44 views
0

我試圖在Flex中開發的AIR應用程序中組件化UI的一個組件。在這個例子中,我想在一行(它有一個圖標,一些文本/鏈接和大小)上顯示文件信息。使用動作腳本中的複合MXML組件

我的代碼看起來像這樣(組件被稱爲FileDisplay):

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:Script> 
     <![CDATA[ 
      public function set iconType(source:String):void { 
       this.ficon.source = source; 
      } 

      public function set fileName(name:String):void { 
       this.fname.htmlText = name; 
      } 

      public function set fileSize(size:String):void { 
       this.fsize.text = size; 
      } 
     ]]> 
    </mx:Script> 
    <mx:Image id="ficon" /> 
    <mx:Label id="fname" left="20" right="30" text="Filename" /> 
    <mx:Label id="fsize" right="0" text="0 K" /> 
</mx:Canvas> 

當我在我的主要應用程序中使用該組件時,動作的樣子:

for each (var file:XML in result.files) { 
    var fd:FileDisplay = new FileDisplay(); 
    fd.fileName = '<a href="blah">'+file.name+'</a>'; 
    fd.iconType = getFileTypeIcon(file.name); 
    fd.fileSize = getFileSizeString(file.size); 

    this.file_list.addChild(fd); 
} 

然而,當我這樣做,我得到一個錯誤:錯誤#1009:無法訪問空對象引用的屬性或方法。這是因爲FileDisplay的子組件是null(或者至少它們在調試器中以這種方式顯示)。

有誰知道是否有辦法解決這個問題?我是否應該等待事件顯示子組件已創建?有沒有更常見的模式可以解決這個問題?

現在我可以做手工在ActionScript一切都在我的主要應用程序(創建一個畫布,並添加孩子吧),但我想知道關於如何將代碼更乾淨分開任何見解。

回答

3

可綁定到救援:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:Script> 
     <![CDATA[ 
       [Bindable] 
       public var iconType:String; 
       [Bindable] 
       public var fileName:String = "Filename"; 
       [Bindable] 
       public var fileSize:String = "0 K"; 
     ]]> 
    </mx:Script> 
    <mx:Image id="ficon" source="{iconType}"/> 
    <mx:Label id="fname" left="20" right="30" text="{fileName}" /> 
    <mx:Label id="fsize" right="0" text="{fileSize}" /> 
</mx:Canvas> 

的值將被創建的組件時,可以自動更新。

1

子組件尚未加載。

閱讀:http://livedocs.adobe.com/flex/3/html/help.html?content=ascomponents_advanced_2.html#203434

然後,像我這樣,你不明白它(並且它不可靠),在FileDisplay中監聽FlexEvent.CREATION_COMPLETE,並在其中應用你的子組件屬性。

或者更好的編程方式創建的三個孩子中的「createChildren」功能,並應用設置在那裏。

這兩種方法假定您設置文件名,icontype和文件大小爲本地成員將其應用到子組件,你應該做的,無論之前。

+0

感謝您的見解。有關如何使用「高級」自定義組件的文檔相當混亂。我感覺我的情況並不罕見,他們應該可能有更多像這樣的例子。 – 2009-09-01 14:12:34

1

保存FileDisplay組件的父組件是什麼?如果您確定錯誤來自於FileDisplay的子組件未被實例化的事實,那麼您可能需要查看creationPolicy屬性並確保它在該父組件上設置爲ContainerCreationPolicy.ALL。

=瑞恩

+0

沒關係。 FileDisplay的子項沒有時間在「新的FileDisplay()」調用和屬性分配之間創建。 – Glenn 2009-09-01 08:01:22

0

除了把creationPolicy設置爲全部,你需要通過的addChild爲DisplayObject添加到舞臺上。直到您將其添加到舞臺中,纔會創建FileDisplay的子項。所以做:

for each (var file:XML in result.files) { 
    var fd:FileDisplay = new FileDisplay(); 
    this.file_list.addChild(fd); 

    fd.fileName = '<a href="blah">'+file.name+'</a>'; 
    fd.iconType = getFileTypeIcon(file.name); 
    fd.fileSize = getFileSizeString(file.size);  
}