Como faço um loop pelos objetos de resultado no Flex?
-
09-06-2019 - |
Pergunta
Estou tendo problemas para fazer o loop manual dos dados xml recebidos por meio de uma chamada HTTPService. O xml é mais ou menos assim:
<DataTable>
<Row>
<text>foo</text>
</Row>
<Row>
<text>bar</text>
</Row>
</DataTable>
Quando o evento de resultado do webservie é acionado, faço algo assim:
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!');
}
Este código funciona, então há mais de 1 nó "Linha" retornado, no entanto, parece que se houver apenas um nó "Linha", o objeto event.DataTable.Row não é um erro e o código quebra posteriormente.
Qual é a maneira correta de percorrer o objeto de resultado HTTPService?Preciso convertê-lo em algum tipo de coleção XMLList ou ArrayCollection?Tentei definir o resultFormat como "e4x" e isso ainda não resolveu o problema...
Obrigado
Solução
O problema está nesta afirmação
event.result.DataTable.Row.length
length
não é propriedade de XMLList
, mas um método:
event.result.DataTable.Row.length()
é confuso, mas é assim que as coisas são.
Adição: na verdade, a coisa mais segura a fazer é sempre usar um for each
loop ao iterar XMLList
s, assim você nunca comete erros, tem menos código e é mais fácil de ler:
for each ( var node : XML in event.result.DataTable.Row )
Outras dicas
Row não é uma matriz, a menos que haja vários elementos Row.É irritante.Você tem que fazer algo assim, mas eu não escrevo AS3 há algum tempo, então esqueço se existe uma função.
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!');
}
Eu o armazenaria em um objeto Xml e usaria seus métodos para procurar o valor do nó necessário.
var returnedXml:Xml = new Xml(event.result.toString());