Flex检测CollectionEvent更改

时间:2012-08-13 11:17:27

标签: flex

在一台PC上,我有一个datagrid,dataprovider是一个arraycollection,由一组从MySQL DB中检索到的记录填充。在另一台PC上,另一个组件检索相同的记录集合并更新它们。实际上,PC one中的数据网格反映了PC 2中的变化,这很好,因为它将更改推送到所有受影响的在线控件。但是,我想检测arraycollection更改以执行其他一些操作,但是未检测到此类CollectionEvent.COLLECTION_CHANGE。你能帮帮忙吗?这是代码:

protected function doInit():void
{
acLeave.addEventListener(CollectionEvent.COLLECTION_CHANGE, onAcLeaveChange);
}

protected function onAcLeaveChange(event:CollectionEvent):void
{
do something
}

我正在使用lcds,数据管理服务已经处理了数据同步。这就是具有数据网格数据提供程序acLeave的第一台PC自动更改的原因。不知何故,这是因为lcds知道有一个客户端(pc one)在线,然后它将更改推送到它。我的问题是datagrid数据发生了变化,我想检测是否发生了数据更改,以便我可以进行一些其他更新。通常,为了检测datagrid更改,我可以使用datagrid datachange或者只是addlistener到collectionEvent.COLLECTION_CHANGE的数据提供程序,但在这种情况下即使我可以看到ac acLeave已更改,事件也不会触发。请帮忙!

嗨,我再次感谢您的建议。我已将setter添加到acLeave但仍无法侦听collectionEvent更改。这是修改后的代码:

private var _acLeave:ArrayCollection = new ArrayCollection();

[Bindable]
public function get acLeave():ArrayCollection
{
    return _acLeave;
}
public function set acLeave(value:ArrayCollection):void
{
    _acLeave = value;
}
protected function doInit():void
{
    acLeave.addEventListener(CollectionEvent.COLLECTION_CHANGE, onAcChange);
}

protected function dataGrid_creationCompleteHandler(event:FlexEvent):void
{
    getAllResult.token = leaverequestService.getAll();
    getAllResult.addEventListener(ResultEvent.RESULT, onGotResult);
}

protected function onGotResult(event:ResultEvent):void
{
    acLeave = getAllResult.lastResult;
}

protected function onAcChange(event:CollectionEvent):void
{
    // this never executed because unable to detect a change on acLeave
    Alert.show("acLeave Changed !");
}

1 个答案:

答案 0 :(得分:0)

如果您的集合更改处理程序未触发,我猜这样的事情正在发生:

  • pc1添加了集合更改侦听器
  • pc2更改了集合
  • LCDS向pc1发送一个全新的ArrayCollection对象(不仅仅是已更改的元素)以供使用

您正在侦听collectionChange的原始ArrayCollection不一定会被更改,而是替换。因此,没有集合更改事件ocurrs。

如果您为此ArrayCollection(示例中为acLeave)添加了setter方法,那么您将知道是否会发生这种情况。从技术上讲,您应该同时使用集合更改事件和此setter来检测可以更改阵列的所有情况。