1

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

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

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

我正在使用液晶显示器,数据管理服务已经处理了数据同步。这就是为什么第一台带有数据网格数据提供程序 acLeave 的电脑会自动更改。不知何故,这是因为 lcds 知道有一个客户端(pc 之一)在线,然后它将更改推送给它。我的问题是数据网格数据发生了变化,我想检测是否发生了数据变化,以便进行其他更新。通常,要检测数据网格更改,我可以使用 datagrid datachange 或简单地将侦听器添加到 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 !");
}
4

1 回答 1

0

如果您的集合更改处理程序没有触发,我猜会发生这样的事情:

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

您正在收听的原件ArrayCollectioncollectionChange 不一定会发生变化,而是会被替换。所以不会发生集合更改事件。

如果您为此添加一个 setter 方法ArrayCollectionacLeave在您的示例中),那么您将知道这是否会发生。从技术上讲,您应该同时使用集合更改事件和此设置器,以便能够检测到可以更改数组的所有情况。

于 2012-08-13T21:36:26.497 回答