转发器中的Flex Datagrid - 数据绑定警告

时间:2010-07-08 11:38:04

标签: flex flash-builder

在我的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>

2 个答案:

答案 0 :(得分:4)

  

数据绑定无法检测到“报告”的分配

您的dataProvider是rptReport.currentItem.report。其中,作为mxml元素的rptReportBindablecurrentItem组件的Repeater属性也声明为Bindable。当前项的report属性不可绑定 - 当前项本身只是一个对象。通过此警告,Flex表示如果将已分配对象的report更改为其他对象,则不会自动反映在数据网格中。

在大多数情况下,您可以安全地忽略此类警告。

当您在mxml中说x="{a.b.c.d}"时,保证flex将检测对链中的四个项目(a,b,c和d)中的任何一个所做的更改并更新{{1}的值}。换句话说,xxaa.b更改时,b.c会发生变化。为此,Flex期望所有这四个都被声明为可绑定。如果它发现任何这些项目不可绑定,它将发出警告。如果属性是使用mxml声明的,或者在ActionScript中使用c.d元数据标记声明属性,则该属性是可绑定的。

在大多数情况下,只会对[Bindable]a的更改感兴趣。在您的示例中,只有在重新发送a.b时才会发生更改,在这种情况下,dataProvider本身会发生更改。

答案 1 :(得分:0)

老兄,有点偏离主题,但在转发器中有一个网格听起来很忙。如果您想要向下钻取,请将其弹出或将其放在仅在该模式下可见的窗格中。

从视觉上看,转发器是用户可以内化的模式。该模式中的网格要处理起来要困难得多。滚动网格与滚动转发器可能会令人沮丧,更不用说Tab导航了。

从逻辑上讲,您正在创建大量的内存中UI。我会担心表现。

考虑使用带有自定义项呈示器的列表而不是转发器。我仍然不会在那里放一个网格,但值得努力。

干杯

相关问题