Comment parcourir les objets de résultat dans Flex ?
-
09-06-2019 - |
Question
J'ai des problèmes pour parcourir manuellement les données XML reçues via un appel HTTPService, le fichier XML ressemble à ceci :
<DataTable>
<Row>
<text>foo</text>
</Row>
<Row>
<text>bar</text>
</Row>
</DataTable>
Lorsque l'événement de résultat du service Web est déclenché, je fais quelque chose comme ceci :
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!');
}
Ce code fonctionne alors il y a plus d'un nœud "Row" renvoyé, mais il semble que s'il n'y a qu'un seul nœud "Row", alors l'objet event.DataTable.Row n'est pas une erreur et le code est ensuite interrompu.
Quelle est la bonne façon de parcourir l’objet de résultat HTTPService ?Dois-je le convertir en un type de collection XMLList ou en ArrayCollection ?J'ai essayé de définir resultFormat sur "e4x" et cela n'a pas encore résolu le problème...
Merci
La solution
Le problème réside dans cette déclaration
event.result.DataTable.Row.length
length
n'est pas une propriété de XMLList
, mais une méthode :
event.result.DataTable.Row.length()
c'est déroutant, mais c'est comme ça.
Ajout: en fait, la chose la plus sûre à faire est de toujours utiliser un for each
boucle lors de l'itération XMLList
s, comme ça vous ne faites jamais d'erreur, c'est moins de code et plus facile à lire :
for each ( var node : XML in event.result.DataTable.Row )
Autres conseils
Row n'est pas un tableau à moins qu'il n'y ait plusieurs éléments Row.C'est ennuyant.Vous devez faire quelque chose comme ça, mais je n'ai pas écrit AS3 depuis un moment donc j'oublie s'il existe une fonction.
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!');
}
Je le stockerais dans un objet XML, puis utiliserais ses méthodes pour rechercher la valeur de nœud dont vous avez besoin.
var returnedXml:Xml = new Xml(event.result.toString());