Flex Datagrid в репитере - предупреждение о привязке данных

В моем приложении 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>

person chapmanio    schedule 08.07.2010    source источник


Ответы (2)


Привязка данных не сможет обнаружить назначения для «отчета»

Ваш dataProvider - rptReport.currentItem.report. Из них rptReport, являясь элементом mxml, равно Bindable. Свойство currentItem компонента Repeater также объявлено как Bindable. Свойство report текущего элемента не может быть привязано - текущий элемент сам по себе является просто объектом. Этим предупреждением Flex сообщает, что если вы измените report уже назначенного объекта на что-то другое, это не будет автоматически отражено в сетке данных.

В большинстве случаев вы можете игнорировать этот тип предупреждений.

Когда вы говорите x="{a.b.c.d}" в mxml, гарантия заключается в том, что flex обнаружит изменения, внесенные в любой из четырех элементов в цепочке (a, b, c и d), и обновит значение x. Другими словами, x изменится при изменении a или a.b, b.c или c.d. Flex ожидает, что для этого все четыре будут объявлены связываемыми. Если он обнаружит, что какой-либо из этих элементов не может быть привязан, он выдаст предупреждение. Свойство можно привязать, если оно было объявлено с помощью mxml или если оно было объявлено с помощью тега метаданных [Bindable] в ActionScript.

В большинстве случаев вас будут интересовать только изменения в a или a.b. В вашем примере изменения происходят только при повторной отправке HTTPService, и в этом случае изменится сам dataProvider.

person Amarghosh    schedule 08.07.2010

Чувак, немного не по теме, но сетка в репитере звучит очень загруженно. Если вы хотите получить детализацию, откройте ее или поместите на панель, которая видна только в этом режиме.

Визуально ретранслятор - это шаблон, который пользователь может усвоить. С сеткой внутри этого паттерна работать намного сложнее. Прокрутка сетки по сравнению с прокруткой ретранслятора, скорее всего, разочарует, не говоря уже о навигации по вкладкам.

С точки зрения логистики вы создаете много пользовательского интерфейса в памяти. Я бы побеспокоился о производительности.

Рассмотрите возможность использования списка с настраиваемым средством визуализации элементов вместо повторителя. Я бы все равно не стал ставить туда сетку, но это того стоит.

Ваше здоровье

person Richard Haven    schedule 02.11.2012