Come posso scorrere gli oggetti risultato in Flex?
-
09-06-2019 - |
Domanda
Sto riscontrando problemi nel ciclo manuale dei dati XML ricevuti tramite una chiamata HTTPService, l'XML è simile al seguente:
<DataTable>
<Row>
<text>foo</text>
</Row>
<Row>
<text>bar</text>
</Row>
</DataTable>
Quando viene attivato l'evento risultato del servizio web, faccio qualcosa del genere:
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!');
}
Questo codice funziona se viene restituito più di 1 nodo "Riga", tuttavia sembra che se è presente un solo nodo "Riga", l'oggetto event.DataTable.Row non è un errore e il codice successivamente si interrompe.
Qual è il modo corretto di eseguire il ciclo dell'oggetto risultato HTTPService?Devo convertirlo in qualche tipo di raccolta XMLList o ArrayCollection?Ho provato a impostare resultFormat su "e4x" e il problema non è ancora stato risolto...
Grazie
Soluzione
Il problema sta in questa affermazione
event.result.DataTable.Row.length
length
non è una proprietà di XMLList
, ma un metodo:
event.result.DataTable.Row.length()
è confuso, ma è così.
Aggiunta: in realtà, la cosa più sicura da fare è usare sempre a for each
loop durante l'iterazione XMLList
s, in questo modo non commetti mai errori, c'è meno codice e più facile da leggere:
for each ( var node : XML in event.result.DataTable.Row )
Altri suggerimenti
Row non è un array a meno che non siano presenti più elementi Row.È noioso.Devi fare qualcosa del genere, ma è da un po' che non scrivo AS3 quindi dimentico se esiste una funzione esistente.
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!');
}
Lo memorizzerei in un oggetto Xml e quindi utilizzerei i suoi metodi per cercare il valore del nodo che ti serve.
var returnedXml:Xml = new Xml(event.result.toString());