flex 3 webservice结果问题

时间:2009-02-05 18:29:10

标签: flex web-services

我遇到了网络服务调用结果的问题。当结果进入并启动resultHandler函数时,我设置了一个断点,以便我可以检查结果。我可以看到数组集合中有0条记录但是我可以看到内容所以我假设零只是指数组的第一个索引

当我尝试将值分配给数组集合时会出现问题,如下所示;

public function resultHandler(event:ResultEvent):void{
    var result:ArrayCollection = event.result as ArrayCollection;

此操作的结果是结果var,其值为null。任何人都可以解释这里可能发生的事情吗?非常感谢

我刚注意到的另一件事是结果类型是mx.utils.ObjectProxy,我期待一个数组

4 个答案:

答案 0 :(得分:2)

如果webservice只返回一个元素,它将被反序列化为ObjectProxy。您必须手动将其转换为数组。

我通常在WS调用后执行此操作:

if (event.result is ArrayCollection) {
    result = event.result;
}
else {
    result = new ArrayCollection([event.result]);
}

答案 1 :(得分:1)

Chetan是对的 - 对ArrayCollection的强制转换操作失败,因为源对象不是ArrayCollection。试试这个:

public function resultHandler(event:ResultEvent):void
{
    var ac:ArrayCollection = new ArrayCollection([event.result])
    // ...
}

“as”运算符将在运行时发生异常的情况下返回null - 在您的情况下,从ObjectProxy转换为ArrayCollection。如果您将event.result作为数组的唯一成员传递(通过用[]包围它),您的ArrayCollection将被正确构造,并且您将能够正常检索该对象:

var o:Object = ac.getItemAt(0) as Object;
trace(o.yourObjectProperty.toString());

希望它有所帮助!

答案 2 :(得分:1)

数组中的0条记录是数组的长度,实际上意味着0.如果在数组的索引0中有某些内容,则该数组的长度至少为1.看起来你没有得到任何数据。数据返回,甚至没有空数组收集。

答案 3 :(得分:0)

我认为问题是你不能将event.result强制转换为数组集合,但你必须将其强制转换为数组。

这方面的最佳做法是拥有一个吸气剂和一个二传手:

private var _acLocation:ArrayCollection=new ArrayCollection;

public function set acLocation(acLocation:ArrayCollection):void{

_acLocation=acLocation;

//do this if you want for exaple to assign the arraycollection to a datagrid dataprovider

dgMyDataGrid.dataProvider=_acLocation;

}

public function get acLocation():ArrayCollection{


return _acLocation;
}

然后在服务调用的结果处理函数中,代码

acLocation=new ArrayCollection(event.result as Array);

希望有所帮助