Flex Datagrid внутри ретранслятора - предупреждение о привязке данных - PullRequest
4 голосов
/ 08 июля 2010

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

4 голосов
/ 08 июля 2010

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

Ваш поставщик данных равен 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.

0 голосов
/ 02 ноября 2012

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

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

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

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

Приветствия

...