如何在 Flex 中循环结果对象?
-
09-06-2019 - |
题
我在手动循环通过 HTTPService 调用接收到的 xml 数据时遇到问题,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”,但尚未解决问题......
谢谢
解决方案
问题就出在这个声明上
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());
不隶属于 StackOverflow