Невозможно получить данные из провайдера данных в приложении Flex - PullRequest
0 голосов
/ 26 января 2012

Я создаю приложение для веб-сайта, которое будет фильтровать магазины, торгующие некоторыми товарами / брендами, и отображать результаты в компоненте «Список».Я прошел весь путь до загрузки данных, помещая бренды / страны / города в комбинированные списки, чтобы пользователь мог фильтровать, в какой стране и городе он хочет искать и какой бренд.Нет проблем до сих пор.Моя проблема заключается в том, что, хотя поставщик данных работает так, как он должен при жестком кодировании некоторых значений для меток, которые я использую для средства визуализации элементов каждой записи, я не могу получить реальные данные от поставщика данных ... вы увидите в приведенном ниже коде, чтов компоненте VGroup (который я использую для каждого магазина в списке) есть 4 метки, где 3 из них жестко запрограммированы, просто чтобы увидеть, как это работает.Одна из меток, тем не менее, пытается получить реальные данные из XML-файла и на этом я остановлюсь.Во всех уроках, которые я видел (и в документации), все просто нажимают «data.XYZ», где XYZ - это имя атрибута или узла, который нужно получить.Выполнение того же в моем случае просто возвращает ошибку «1120: доступ к неопределенным данным свойства».Что я делаю неправильно?Прошло пару часов, я перебираю сотни примеров для flex, как новых, так и старых версий, и я не могу понять, что делать.Это действительно нервы, чтобы придерживаться этой последней мелочи, когда все остальные находятся внутри!Посмотрите на код и дайте мне знать, если я сделал что-то неправильно или я что-то пропустил!разместив код ниже.Существует также файл xml, но он загружен правильно, и в разных списках xmlLists хранятся правильные узлы, поэтому я не думаю, что его нужно публиковать, если вы не думаете иначе.Узлами xml для каждого магазина являются «title», «tel», «mail», «city», и я застрял, пытаясь получить название.Наиболее важной является функция filterShops, а затем, конечно, весь блок list и itemrenderer.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               width="815" height="578" minWidth="955" minHeight="600"
               creationComplete="sendData()">

    <fx:Style source="styles.css"/>

    <fx:Declarations>
        <s:HTTPService id="shopsService" url="data/places.xml"     result="shopsService_return(event)" resultFormat="e4x"/>
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.collections.XMLListCollection;
            import mx.events.FlexEvent;
            import mx.rpc.events.ResultEvent;

            import spark.events.IndexChangeEvent;

            private var placesXML:XMLList;

            [Bindable] private var countriesList:XMLListCollection;
            [Bindable] private var brandsList:XMLListCollection;
            [Bindable] private var citiesList:XMLListCollection;
            [Bindable] private var shopsList:XMLListCollection;
            [Bindable] public var gridList:XMLListCollection;

            private var selectedCountry:int = 0;
            private var selectedCountryId:int = 0;
            private var selectedBrand:int = 0;
            private var selectedCity:int = 0;
            private var selectedBrandId:int = 0;
            private var selectedCityId:int = 0;

            private function sendData():void {
                shopsService.send();
            }

            private function shopsService_return(event:ResultEvent):void {
                placesXML = XMLList(event.result);
                brandsList = new XMLListCollection(placesXML.brands.brand);
                citiesList = new     XMLListCollection(placesXML.countries.country[0].cities.city);
                shopsList = new XMLListCollection(placesXML.shops.shop);
                gridList = new XMLListCollection();
            }

            private function onBrandboxChange(event:IndexChangeEvent):void {
                selectedBrand = event.target.selectedIndex;
                selectedBrandId = placesXML.brands.brand[selectedBrand].attribute("id");
                filterShops(selectedCountryId.toString(),selectedBrandId.toString(),selectedCityId.toString());
            }

            private function onCityboxChange(event:IndexChangeEvent):void {
                selectedCity = event.target.selectedIndex;
                selectedCityId = placesXML.countries.country[selectedCountry].cities.city[selectedCity].attribute("id");
                filterShops(selectedCountryId.toString(),selectedBrandId.toString(),selectedCityId.toString());
            }

            private function englandClick(event:MouseEvent):void
            {
                citiesList = new XMLListCollection(placesXML.countries.country[0].cities.city);
                selectedCountry = 0;
                selectedCountryId = 1;
            }

            private function scotlandClick(event:MouseEvent):void
            {
                citiesList = new XMLListCollection(placesXML.countries.country[1].cities.city);
                selectedCountry = 1;
                selectedCountryId = 2;
            }

            private function filterShops(countryId:String,brandId:String,cityId:String):void {
                var xmlCountryId:String;
                var indexOfBrandId:int;
                var xmlCityId:String;
                //outputLabel.text = countryId+"-"+brandId+"-"+cityId;

                for (var i:int = 0; i < shopsList.length; i++) {
                    xmlCountryId = shopsList[i].attribute("country");
                    xmlCityId = shopsList[i].attribute("city");

                    if (xmlCountryId == countryId && xmlCityId == cityId) {
                        indexOfBrandId = shopsList[i].attribute("brands").toString().split(",").indexOf(brandId);
                        if (indexOfBrandId > -1) gridList.addItem(shopsList[i]);
                    }
                    outputLabel.text = shopsList[0].title;
                }
            }

        ]]>
    </fx:Script>

    <s:List id="outputWindow" x="10" y="230" width="795" height="338" borderVisible="false"
        dataProvider="{gridList}">
        <s:layout>
            <s:TileLayout
            requestedColumnCount="4"
            requestedRowCount="2"
            horizontalGap="2"
            verticalGap="2"/>
        </s:layout>
        <s:itemRenderer>
            <fx:Component>
                <s:VGroup width="180" height="90">
                    <s:Label styleName="item-title" text="{data.title}" />
                    <s:Label color="#868686" fontFamily="pfHighwayRegular" fontSize="12" paddingBottom="-2"
                         paddingTop="-2" styleName="item-text" text="Tel: 0120 230 3777"/>
                    <s:Label styleName="item-text" text="Mail: info@2012ltd.co.uk"/>
                    <s:Label styleName="item-link" text="Web: www.2012ltd.co.uk"/>
                </s:VGroup>
            </fx:Component>
        </s:itemRenderer>
    </s:List>
    <s:Button x="6" y="8" label="England" click="englandClick(event)"/>
    <s:Button x="125" y="8" label="Scotland" click="scotlandClick(event)" />
    <s:Button x="261" y="10" label="Wales"/>
    <s:Button x="400" y="10" label="Ireland"/>
    <s:ComboBox x="505" y="56" id="brandBox" dataProvider="{brandsList}" change="onBrandboxChange(event)" />
    <s:ComboBox x="659" y="56" id="cityBox" dataProvider="{citiesList}" change="onCityboxChange(event)" />
    <s:Label id="outputLabel" x="10" y="119" text="Label"/>
</s:Application>

Ответы [ 2 ]

0 голосов
/ 27 января 2012

Поэтому выньте ваш компонент из встроенного определения и определите его в другом файле, что сделает это немного менее запутанным, когда вы добавите в VGroup инструменты и реализует IDropInListItemRenderer и IDataRenderer.Это означает, что у вас будет свойство data и свойство listData в рендере, данные будут иметь один элемент списка, назначенный ему для каждого используемого рендерера (или повторного использования), listData будет иметь информацию о главном списке ииндекс данных в dataProvider и т. д.

0 голосов
/ 26 января 2012

Я думаю, вам нужно сослаться на ваш компонент List в вашем itemRenderer.Фактически, это может быть верно для любого встроенного средства визуализации элементов.Попробуйте это:

<s:Label styleName="item-title" text="{parentDocument.data.title}" />

или это:

<s:Label styleName="item-title" text="{outerDocument.data.title}" />
...