2009-02-05 114 views
1

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

当我尝试将值分配给数组集合时发生问题如下;

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

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

另一件事我只注意到的是,结果类型为mx.utils.ObjectProxy,即时通讯等一个阵列

回答

1

阿赫亚是正确的 - 投操作ArrayCollection的失败,因为源对象不是一个ArrayCollection。试试这个:

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

的“作为”运算符将返回在会在运行时出现的异常情况null - 在你的情况下,从铸造ObjectProxy来的ArrayCollection。相反,如果你通过event.result作为数组的唯一成员(通过与[]周围),您的ArrayCollection将被正确构建,您将能够正常检索对象:

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

希望它能帮助!

2

如果web服务返回只有一个元素,它会被反序列化ObjectProxy。您将不得不手动将其转换为数组。

我通常做一个WS调用后:

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

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

0

在我看来,问题是你不能将event.result强制转换为一个数组集合,但是你必须将它转换为一个数组。

在这个最好的做法是有一个getter和一个setter:

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); 

希望它可以帮助