如何在Flex中循环结果对象?

时间:2008-09-02 23:29:00

标签: flex actionscript-3 actionscript

我在手动循环通过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个“行”节点,但似乎只有一个“行”节点,则event.DataTable.Row对象不是错误,代码随后中断。

循环访问HTTPService结果对象的正确方法是什么?我需要将其转换为某种类型的XMLList集合或ArrayCollection吗?我已经尝试将resultFormat设置为“e4x”,而这还没有解决问题...

由于

3 个答案:

答案 0 :(得分:4)

问题在于这个陈述

event.result.DataTable.Row.length

length不是XMLList的属性,而是方法:

event.result.DataTable.Row.length()

令人困惑,但就是这样。

添加:实际上,最安全的做法是在迭代for each时总是使用XMLList循环,这样你永远不会犯错误,它会更少代码,更容易阅读:

for each ( var node : XML in event.result.DataTable.Row )

答案 1 :(得分:2)

除非有多个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!');
}

答案 2 :(得分:1)

我会将它存储在Xml对象中,然后使用其方法搜索所需的节点值。

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