我遇到了网络服务调用结果的问题。当结果进入并启动resultHandler函数时,我设置了一个断点,以便我可以检查结果。我可以看到数组集合中有0条记录但是我可以看到内容所以我假设零只是指数组的第一个索引
当我尝试将值分配给数组集合时会出现问题,如下所示;
public function resultHandler(event:ResultEvent):void{
var result:ArrayCollection = event.result as ArrayCollection;
此操作的结果是结果var,其值为null。任何人都可以解释这里可能发生的事情吗?非常感谢
我刚注意到的另一件事是结果类型是mx.utils.ObjectProxy,我期待一个数组
答案 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);
希望有所帮助