Я создаю приложение для веб-сайта, которое будет фильтровать магазины, торгующие некоторыми товарами / брендами, и отображать результаты в компоненте «Список».Я прошел весь путь до загрузки данных, помещая бренды / страны / города в комбинированные списки, чтобы пользователь мог фильтровать, в какой стране и городе он хочет искать и какой бренд.Нет проблем до сих пор.Моя проблема заключается в том, что, хотя поставщик данных работает так, как он должен при жестком кодировании некоторых значений для меток, которые я использую для средства визуализации элементов каждой записи, я не могу получить реальные данные от поставщика данных ... вы увидите в приведенном ниже коде, чтов компоненте 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>