2010-07-08 60 views
4

在我的Flex應用程序中,我使用轉發器來顯示有關我的數據庫數據的報告。在這份報告中,用戶可以「深入」數據以顯示更多細節。爲了讓這個更容易,我有一個標題標籤,然後是中繼器中的數據網格。轉發器內的Flex數據格 - 數據綁定警告

雖然這完美的作品,因爲DataGrid的數據提供程序來自於中繼數據提供器的陣列,它是導致以下警告:

數據綁定將無法檢測到分配到「報告」

警告是這一行:

<mx:DataGrid id="dgReport" dataProvider="{rptReport.currentItem.report}" rowCount="{rptReport.currentItem.report.length}"> 

下面是我的代碼,如果任何人有我怎樣才能擺脫警告的任何建議/做正確的我會非常歡迎!

<mx:Script> 
    <![CDATA[ 
     [Bindable] private var reportProvider; 

     private function report_Handler(event:ResultEvent):void { 
      // Temp variables 
      var currentHeader:String = ""; 
      var previousHeader:String = ""; 

      // Retrieve PHP array 
      var reportPHP:Array = ArrayUtil.toArray(event.result); 

      // Create Flex array 
      var reportFlex:Array = []; 
      var reportFlex_dataGrid:Array = []; 

      // Loop through PHP array 
      for(var i:int = 0; i < reportPHP.length; i++) { 
       // Retrieve current header 
       currentHeader = reportPHP[i].header; 

       // Clear array 
       if (currentHeader != previousHeader) { 
        reportFlex_dataGrid = []; 
       } 

       reportFlex_dataGrid.push({column1:reportPHP[i].column1, column2:reportPHP[i].column2, column3:reportPHP[i].column3});        
      } 

      // Add to repeater array 
      if (currentHeader != previousHeader) {       
       // Add to array 
       reportFlex.push({header:reportPHP[i].header, report:reportFlex_dataGrid}); 
      } 

      // Store previous headers 
      previousHeader = reportPHP[i].header; 

      // Add to combobox data provider 
      reportProvider = new ArrayCollection(reportFlex); 
     }      
    ]]> 
</mx:Script> 

<mx:Repeater id="rptReport" dataProvider="{reportProvider}"> 
    <mx:VBox> 
     <mx:Spacer height="5"/> 

     <mx:Label id="lblHeader" text="{rptReport.currentItem.header}"/> 

     <mx:DataGrid id="dgReport" dataProvider="{rptReport.currentItem.report}" rowCount="{rptReport.currentItem.report.length}"> 
      <mx:columns> 
       <mx:DataGridColumn headerText="Column1" dataField="column1"/> 
       <mx:DataGridColumn headerText="Column2" dataField="column2"/> 
       <mx:DataGridColumn headerText="Column3" dataField="column3"/> 
      </mx:columns> 
     </mx:DataGrid> 
    </mx:VBox> 
</mx:Repeater> 

回答

4

數據綁定將無法檢測到的任務 「報告」

你dataProvider是rptReport.currentItem.report。其中,作爲mxml元素的rptReportBindableRepeater組件的currentItem屬性也聲明爲Bindable。當前項目的report屬性不可綁定 - 當前項目本身只是一個對象。 Flex通過這個警告說,如果將已分配對象的report更改爲其他內容,它將不會自動反映到數據網格中。

在大多數情況下,您可以放心地忽略此類警告。

當您在mxml中說x="{a.b.c.d}"時,保證flex會檢測對鏈(a,b,c和d)中的任意四項進行的更改並更新x的值。換句話說,當aa.bb.cc.d發生更改時,x將會更改。爲此,Flex期望所有這四者都被聲明爲可綁定的。如果發現這些項目中的任何一個都不可綁定,則會發出警告。如果使用mxml聲明屬性,或者使用ActionScript中的[Bindable]元數據標記聲明屬性,則該屬性是可綁定的。

在大多數情況下,只會對aa.b的更改感興趣。在你的例子中,只有在重新發送HTTPService時纔會發生更改,在這種情況下,dataProvider本身將發生更改。

0

老兄,有點偏離主題,但在轉發器中有網格,聽起來真的很忙。如果您希望進行深入分析,請將其彈出或放入僅在該模式下可見的窗格中。

可見,中繼器是一種用戶可以內化的模式。該模式內的網格很難處理。滾動網格與滾動中繼器可能會令人沮喪,更不用說Tab導航。

從邏輯上講,您正在創建大量的內存中UI。我會擔心表現。

考慮使用帶有自定義項目渲染器而不是中繼器的List。我仍然不會在那裏放置電網,但是這是值得的。

乾杯