1

flex中,我使用了一个组件,该组件从其 dataProvider ( ListCollectionView ) 中显示特定项目 (selectedItem 字段)。

我的 dataProvider 的元素可以通过不同的方式进行编辑。每次编辑时,都会发送一个更新事件,从而更新 dataProvider 集合(ListCollectionView:: listChangeHandler)。

在此过程中,如果我的 selectedItem 是已编辑的元素,它会被删除(通过 ListCollectionView:: moveItemInView设置为 null ),即使已编辑的字段在任何地方都没有使用。

有没有办法避免这种情况?

更具体地说,不必先保存它,让它丢失并在之后恢复它(这在此处几乎不可行)


编辑: 好的,我想我可以进一步解释:

在我的代码中,我对绑定到 dataProvider 的列表中的一项的属性进行了处理。我不知道具体原因,可能是因为项目的类是 [bindable],这会引发更新事件。

此事件被 ArrayList::itemUpdateHandler 捕获,并将其分派给 ListCollectionView::listChangeHandler。此时,事件“kind”是“update”,这对我来说似乎没问题……</p>

但是从那里开始,它转到ListCollectionView::moveItemInView(我认为这是有意义的,因为如果列表已排序,该项目应该必须更新其位置)。此函数将项目从其以前的位置移除并将其添加到其新位置。

当它删除它时,它会发送一个带有“remove”类型的新事件。这就是问题所在:我的组件侦听它使用的数据的删除事件,如果删除了这个元素,则删除它的 selectedItem。

我认为在调用 moveItemInView 时出现问题:ListCollectionView::handlePropertyChangeEvents 中的调用(由 listChangeHandler 调用)是:moveItemInView(updateEntry.item, updateEntry.item, eventItems); (其中 updateEntry.item 是列表的修改项,而 eventItems 是一个空数组)

而它的原型是:私有函数 moveItemInView(item:Object, dispatch:Boolean = true, updateEventItems:Array = null):void

那是一个错误吗?

4

1 回答 1

1

你如何更新数据提供者?如果是这样

list.dataProvider = newDataProvider

然后你看到的行为是预期的。从 List 的角度来看,您已经完全替换了 dataProvider,并且 List 无法知道旧的 selectedItem/selectedIndex 是否仍然有效。我认为它做出了正确的假设,假设它不是。

还是使用 dataProvider 的 refresh 方法更新 dataProvider:

list.dataProvider.refresh();

在这种情况下,dataProvider 的长度可能会改变;它的元素也是如此。在这种情况下,将分派一个 collectionChange 事件,并且列表应该有一个方法来处理 collectionChange 事件。List 无法知道之前选择的项目是否会在新列表中;它的索引是否会改变,或者即使旧的 selectedIndex 仍然有效。因此, selectedItem 被重置。

通常要在任何一种情况下保留 selectedItem/selectedIndex,您应该存储对它的引用并在 dataProvider 更改后将其重置:

mySelectedItem = list.dataProvider.selectedItem;
// update dataProvider Here
list.dataProvider.selectedItem = mySelectedItem;

如果您只是更新 dataProvider 中的项目;那么 selectedIndex/selectedItem 不应该受到影响。

于 2012-12-12T18:34:56.057 回答