在我的Flex应用程序中,我使用转发器显示有关数据库数据的报告。在此报告中,用户可以“深入”查看数据以显示更多详细信息。为了使眼睛更容易,我有一个标题标签,然后是转发器中的数据网格。
虽然这很有效,但因为数据网格的数据提供者来自转发器数据提供者中的数组,所以它会引发以下警告:
数据绑定无法检测到“报告”的分配
警告是针对此行:
<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>
答案 0 :(得分:4)
数据绑定无法检测到“报告”的分配
您的dataProvider是rptReport.currentItem.report
。其中,作为mxml元素的rptReport
是Bindable
。 currentItem
组件的Repeater
属性也声明为Bindable
。当前项的report
属性不可绑定 - 当前项本身只是一个对象。通过此警告,Flex表示如果将已分配对象的report
更改为其他对象,则不会自动反映在数据网格中。
在大多数情况下,您可以安全地忽略此类警告。
当您在mxml中说x="{a.b.c.d}"
时,保证flex将检测对链中的四个项目(a,b,c和d)中的任何一个所做的更改并更新{{1}的值}。换句话说,x
或x
或a
或a.b
更改时,b.c
会发生变化。为此,Flex期望所有这四个都被声明为可绑定。如果它发现任何这些项目不可绑定,它将发出警告。如果属性是使用mxml声明的,或者在ActionScript中使用c.d
元数据标记声明属性,则该属性是可绑定的。
在大多数情况下,只会对[Bindable]
或a
的更改感兴趣。在您的示例中,只有在重新发送a.b
时才会发生更改,在这种情况下,dataProvider本身会发生更改。
答案 1 :(得分:0)
老兄,有点偏离主题,但在转发器中有一个网格听起来很忙。如果您想要向下钻取,请将其弹出或将其放在仅在该模式下可见的窗格中。
从视觉上看,转发器是用户可以内化的模式。该模式中的网格要处理起来要困难得多。滚动网格与滚动转发器可能会令人沮丧,更不用说Tab导航了。
从逻辑上讲,您正在创建大量的内存中UI。我会担心表现。
考虑使用带有自定义项呈示器的列表而不是转发器。我仍然不会在那里放一个网格,但值得努力。
干杯