PDA

Просмотр полной версии : Подготовка внешних XML данных и загрузка их в компонент


quazare
06.11.2007, 22:27
Народ, хочу спросить кто как грузить внешние XML данные в компоненты - например (ComboBox и DataGrid).

Есть такая XML:

<?xml version="1.0" encoding="utf-8"?>
<spisok>
<razdel>раздел 1</razdel>
<razdel>раздел 2</razdel>
<razdel>раздел 3</razdel>
</spisok>

Как правильно обработать эти данные и загрузить их в компонент? Я делаю так:

1.Инициализирую массивы и загрузку:

[Bindable]
public var externalXML:XML=new XML();
public var cards:Array =new Array();

private function initApp():void {
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("xmlFile.xml");
loader.load(request);
loader.addEventListener(Event.COMPLETE, onComplete);
}

private function onComplete(event:Event):void {
var loader:URLLoader = URLLoader(event.target);
externalXML = XML(loader.data);

for (var i:int=0; i<externalXML.children().length(); i++){
cards[i]={label:externalXML.children()[i].toString()};
}
}

2.Через dataProvider загоняю массив в компонент:

<mx:ComboBox x="93" y="34" id="razdel" dataProvider="{cards}" width="191"></mx:ComboBox>

Вроде все отображается и загружается (для комбобоха), но как-то кривовато(то что не нравиться я выделил красным).

Кроме того, массив cards[i] -вообще не воспринимается через dataProvider в DataGrid.

Прошу помочь правильно описать данный массив для компонентов ComboBox и DataGrid.

Большое спасибо! :umnik2:

fishbounce
06.11.2007, 23:47
а почему просто не написать так:

<mx:ComboBox x="93" y="34" id="razdel" dataProvider="{externalXML..razdel}" width="191" />

?
тока в начале надо так написать:

[Bindable]
public var externalXML : XML = null;

librio
07.11.2007, 16:22
1. Лично мне удобнее всего работать с ArrayCollection, потому как там кроме всего прочего, есть удобные средства сортировки, фильтрации и проч.
2. Лучше все-таки избегать глобальных переменных как у тебя сейчас (рельно можно обойтись без нее в приведенном примере).
3. Просто совет: если тебе придется загружать много одинаковых по структуре XML - сразу напиши обертку над HTTPService (под конкретный протокол) - это сильно облегчит задачу в будущем.

На счет "неуклюжести" не беспокойся. Чего переживать из-за одной такой строчки. Многие пишут сотни строк неуклюжего кода и не краснеют. Главное - результат

zlatko
07.11.2007, 18:08
3. Просто совет: если тебе придется загружать много одинаковых по структуре XML - сразу напиши обертку над HTTPService (под конкретный протокол) - это сильно облегчит задачу в будущем.


Извините что встряю, но можна чуточку поподробнее ? :rolleyes:

librio
07.11.2007, 18:34
Извините что встряю, но можна чуточку поподробнее ? :rolleyes:

Что именно поподробнее? Как написать обертку?
В двух словах:
1. Определяемся с протоколом (причем в обе стороны)
2. Пишем ядро класса, отвечающего за посылку запроса/получение ответа
3. Пишем функционал удобного добавления параметров в запрос (например методом push(param, value))
4. Пишем функционал обработки результата. То есть чтобы нам сразу приходило кастомное событие с сформированным как нам нужно ArrayCollection и дополнительной инфой из ответа.

= Получаем хорошо расширяемую обертку. Поменяли протокол? - меняем только этот класс и перекомпиливаем все модули, которые его используют. И все. Думаю понятны преимущества такого подхода.

quazare
07.11.2007, 19:05
1. Лично мне удобнее всего работать с ArrayCollection, потому как там кроме всего прочего, есть удобные средства сортировки, фильтрации и проч.
2. Лучше все-таки избегать глобальных переменных как у тебя сейчас (рельно можно обойтись без нее в приведенном примере).
3. Просто совет: если тебе придется загружать много одинаковых по структуре XML - сразу напиши обертку над HTTPService (под конкретный протокол) - это сильно облегчит задачу в будущем.

На счет "неуклюжести" не беспокойся. Чего переживать из-за одной такой строчки. Многие пишут сотни строк неуклюжего кода и не краснеют. Главное - результат
дело не совсем в неуклюжести - все работает, но для компонента Комбобокс не отображает элемент "по умолчанию", подскажите как это сделать.

Кроме того, если не сильно сложно, представь пожалуйста вариант через АррайКоллекшенс.

Большое спасибо

zlatko
08.11.2007, 12:30
2 librio
Понял. Спасибо !

quazare
08.11.2007, 16:09
Народ, а по теме кто-нибудь мне ответит?

librio
08.11.2007, 17:36
дело не совсем в неуклюжести - все работает, но для компонента Комбобокс не отображает элемент "по умолчанию", подскажите как это сделать.
Кроме того, если не сильно сложно, представь пожалуйста вариант через АррайКоллекшенс.


А что ты видишь по умолчанию в combo box?
На счет ArrayCollection - примеры ищи в help, там они есть.

quazare
08.11.2007, 20:30
А что ты видишь по умолчанию в combo box?
На счет ArrayCollection - примеры ищи в help, там они есть.
дак в том-то и дело. что в комбо боксе - по умолчанию ничего не стоит - а должен - первый элемент списка... как сие исправить...