Как мне перебирать объекты результатов в Flex?
-
09-06-2019 - |
Вопрос
У меня возникли проблемы с ручным циклом обработки данных XML, полученных через вызов HTTPService. XML выглядит примерно так:
<DataTable>
<Row>
<text>foo</text>
</Row>
<Row>
<text>bar</text>
</Row>
</DataTable>
Когда запускается событие результата веб-сервиса, я делаю что-то вроде этого:
for(var i:int=0;i<event.result.DataTable.Row.length;i++)
{
if(event.result.DataTable.Row[i].text == "foo")
mx.controls.Alert.show('foo found!');
}
Этот код работает, если возвращается более 1 узла «Строка», однако кажется, что если есть только один узел «Строка», то объект event.DataTable.Row не является ошибкой, и код впоследствии ломается.
Как правильно перебрать объект результата HTTPService?Нужно ли мне преобразовать его в какой-либо тип коллекции XMLList или ArrayCollection?Я попытался установить для resultFormat значение «e4x», но это еще не решило проблему...
Спасибо
Решение
Проблема в этом утверждении
event.result.DataTable.Row.length
length
не является собственностью XMLList
, но метод:
event.result.DataTable.Row.length()
это сбивает с толку, но это так.
Добавление: на самом деле, самое безопасное — всегда использовать for each
цикл при повторении XMLList
s, таким образом вы никогда не допустите ошибки, будет меньше кода и его будет легче читать:
for each ( var node : XML in event.result.DataTable.Row )
Другие советы
Row не является массивом, если не существует нескольких элементов Row.Это раздражает.Вам нужно сделать что-то вроде этого, но я давно не писал AS3, поэтому забыл, существует ли там функция существования.
if (exists(event.result.DataTable) && exists(event.result.DataTable.Row)){
if (exists(event.result.DataTable.Row.length)) {
for(var i:int=0;i<event.result.DataTable.Row.length;i++)
{
if (exists(event.result.DataTable.Row[i].text)
&& "foo" == event.result.DataTable.Row[i].text)
mx.controls.Alert.show('foo found!');
}
}
if (exists(event.result.DataTable.Row.text)
&& "foo" == event.result.DataTable.Row.text)
mx.controls.Alert.show('foo found!');
}
Я бы сохранил его в объекте Xml, а затем использовал его методы для поиска нужного значения узла.
var returnedXml:Xml = new Xml(event.result.toString());