在一台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 !");
}
答案 0 :(得分:0)
如果您的集合更改处理程序未触发,我猜这样的事情正在发生:
ArrayCollection
对象(不仅仅是已更改的元素)以供使用您正在侦听collectionChange的原始ArrayCollection
不一定会被更改,而是替换。因此,没有集合更改事件ocurrs。
如果您为此ArrayCollection
(示例中为acLeave
)添加了setter方法,那么您将知道是否会发生这种情况。从技术上讲,您应该同时使用集合更改事件和此setter来检测可以更改阵列的所有情况。