Как мне перебрать объекты результата во Flex? - PullRequest
3 голосов
/ 03 сентября 2008

У меня проблемы с ручным циклическим просмотром данных xml, полученных через вызов HTTPService, xml выглядит примерно так:


<DataTable>
    <Row>
        <text>foo</text>
    </Row>
    <Row>
        <text>bar</text>
    </Row>
</DataTable>

Когда запускается событие результата webservie, я делаю что-то вроде этого:


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 узла "Row", однако кажется, что если существует только один узел "Row", то объект event.DataTable.Row не является ошибкой, и код впоследствии нарушается.

Как правильно перебрать объект результата HTTPService? Нужно ли конвертировать его в какой-либо тип коллекции XMLList или ArrayCollection? Я попытался установить resultFormat на "e4x", и это еще не решило проблему ...

Спасибо

Ответы [ 3 ]

4 голосов
/ 03 сентября 2008

Проблема заключается в этом утверждении

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 )
2 голосов
/ 03 сентября 2008

Строка не является массивом, если нет нескольких элементов строки. Это раздражает. Вы должны сделать что-то подобное, но я давно не писал 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!');
}
1 голос
/ 03 сентября 2008

Я бы сохранил его в объекте XML и затем использовал его методы для поиска нужного значения узла.

var returnedXml:Xml = new Xml(event.result.toString());
...