2010-07-08 61 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。我仍然不会在那里放置电网,但是这是值得的。

干杯