2010-04-14 42 views
0

我有一個名爲包含如下幾個數據及其相關的一系列功能TableDataViewer組件:命令的調用來調用Flex組件時設置的功能

 [Bindable] 
     private var _dataSetLoader:DataSetLoader; 
     public function get dataSetLoader():DataSetLoader {return _dataSetLoader;} 
     public function set dataSetLoader(dataSetLoader:DataSetLoader):void { 
      trace("setting dSL"); 
      _dataSetLoader = dataSetLoader; 
     } 

     [Bindable] 
     private var _table:Table = null; 
     public function set table(table:Table):void { 
      trace("setting table"); 
      _table = table; 
      _dataSetLoader.load(_table.definition.id, "viewData", _table.definition.id); 
     } 

這部分嵌套在另一個組件,如下:

<ve:TableDataViewer width="100%" height="100%" paddingTop="10" dataSetLoader="{_openTable.dataSetLoader}" 
    table="{_openTable.table}"/> 

查看日誌中的跟蹤,在設置dataSetLoader的調用之前調用set table。這是一個真正的恥辱,因爲set()需要設置dataSetLoader來調用它的load()函數。

所以我的問題是,有沒有一種方法來強制在聲明組件時調用set函數的順序?

回答

0

Flex文檔提到了(某處,我現在找不到它)MXML中設置的屬性初始化順序未定義。也就是說,有時dataSetLoader可能會先設置其值,然後再設置table,或者有時候會相反。

要解決此問題,您可以使用Flex無效方法(如invalidateProperties() and invalidateDisplayList())等到您設置了所有屬性,然後一次執行所有屬性。

作爲一個例子,這裏是你如何處理你的問題。
請注意,我們在調用_dataSetLoader.load(...)方法移到commitProperties()方法,當我們知道我們有兩個tabledataSetLoader值:

[Bindable] 
    private var _dataSetLoader:DataSetLoader; 
    private var dataSetLoaderChanged:Boolean = false; 
    public function get dataSetLoader():DataSetLoader {return _dataSetLoader;} 
    public function set dataSetLoader(dataSetLoader:DataSetLoader):void{ 
     trace("setting dSL"); 
     _dataSetLoader = dataSetLoader; 

     dataSetLoaderChanged = true; 
     invalidateProperties(); 
    } 

    [Bindable] 
    private var _table:Table = null; 
    private var tableChanged:Boolean = false; 
    public function set table(table:Table):void { 
     trace("setting table"); 
     _table = table; 

     tableChanged = true; 
     invalidateProperties(); 
    } 

    override protected function commitProperties():void 
    { 
     super.commitProperties(); 

     if (tableChanged || dataSetLoaderChanged) 
     { 
      if (_dataSetLoader != null) 
      { 
       _dataSetLoader.load(_table.definition.id, "viewData", _table.definition.id); 
      } 

      tableChanged = false; 
      dataSetLoaderChanged = false; 
     } 
    } 
+0

優秀,非常感謝你。 – Jason 2010-04-14 21:09:56