Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 选择Flex中数据提供程序更新时删除的编辑项_Apache Flex_Selecteditem_Updating_Dataprovider_Listcollectionview - Fatal编程技术网

Apache flex 选择Flex中数据提供程序更新时删除的编辑项

Apache flex 选择Flex中数据提供程序更新时删除的编辑项,apache-flex,selecteditem,updating,dataprovider,listcollectionview,Apache Flex,Selecteditem,Updating,Dataprovider,Listcollectionview,在flex中,我使用了一个组件,该组件显示其数据提供程序(ListCollectionView)中的特定项(selectedItem字段) 我的数据提供者的元素可以通过不同的方式进行编辑。每次编辑一个时,都会发送一个更新事件,从而更新数据提供程序集合(ListCollectionView::listChangeHandler) 在此过程中,如果my selectedItem是已编辑的元素,则该元素将被擦除(通过ListCollectionView::moveItemInView设置为null),

在flex中,我使用了一个组件,该组件显示其数据提供程序(ListCollectionView)中的特定项(selectedItem字段)

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

在此过程中,如果my selectedItem是已编辑的元素,则该元素将被擦除(通过ListCollectionView::moveItemInView设置为null),即使已编辑的字段未在任何地方使用

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

更具体地说,不必在之前保存它、丢失它并在之后恢复它(这在这里几乎不可行)


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

在我的代码中,我对列表中数据索引到数据提供者的一个项的属性进行了伪装。 我不知道确切的原因,可能是因为该项的类是[bindable],这会引发一个更新事件

ArrayList::itemUpdateHandler捕获此事件,并将其分派给ListCollectionView::listChangeHandler。 在这一点上,事件“种类”是“更新”,这对我来说似乎没问题

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

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

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

而其原型是: 私有函数moveItemInView(项:对象,分派:Boolean=true,updateEventItems:Array=null):void


这是一个bug吗?

如何更新数据提供程序?如果是这样的话

list.dataProvider = newDataProvider
那么您看到的行为是预期的。从列表的角度来看,您已经完全替换了数据提供程序,列表无法知道旧的selectedItem/selectedIndex是否仍然有效。我认为它做出了正确的假设,假设它不是

或者是否使用数据提供程序的刷新方法更新数据提供程序:

list.dataProvider.refresh();
在这种情况下,数据提供者的长度可能会改变;它的元素也是如此。在这种情况下,将调度collectionChange事件,列表应具有处理collectionChange事件的方法。列表无法知道以前选择的项目是否会出现在新列表中;其索引是否会更改,或者即使旧的selectedIndex仍然有效。因此,selectedItem被重置

通常,要在任何情况下保留selectedItem/selectedIndex,您都应该存储对它的引用,并在数据提供程序更改后重置它:

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

如果您只是更新数据提供程序中的项目;然后,selectedIndex/selectedItem不应受到影响。

如何更新数据提供程序?如果是这样的话

list.dataProvider = newDataProvider
那么您看到的行为是预期的。从列表的角度来看,您已经完全替换了数据提供程序,列表无法知道旧的selectedItem/selectedIndex是否仍然有效。我认为它做出了正确的假设,假设它不是

或者是否使用数据提供程序的刷新方法更新数据提供程序:

list.dataProvider.refresh();
在这种情况下,数据提供者的长度可能会改变;它的元素也是如此。在这种情况下,将调度collectionChange事件,列表应具有处理collectionChange事件的方法。列表无法知道以前选择的项目是否会出现在新列表中;其索引是否会更改,或者即使旧的selectedIndex仍然有效。因此,selectedItem被重置

通常,要在任何情况下保留selectedItem/selectedIndex,您都应该存储对它的引用,并在数据提供程序更改后重置它:

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

如果您只是更新数据提供程序中的项目;然后,selectedIndex/selectedItem将不会受到影响。

感谢您的回复!事实上,dataProvider被数据绑定到列表中:对不起,我是StackOverflow的新手(不是消费者),并尝试返回到新行…事实上,dataProvider被数据绑定到列表中:我没有主动更新dataProvider,我想我只是更新列表中的一项。在这一行中,我修改了这样一个项目的属性,该属性引发了一个更新事件,而更新事件又被传递到ListCollectionViews。您将不得不共享更多代码,也许可以编辑您的问题并提供更多详细信息。感谢您的回答!事实上,dataProvider被数据绑定到列表中:对不起,我是StackOverflow的新手(不是消费者),并尝试返回到新行…事实上,dataProvider被数据绑定到列表中:我没有主动更新dataProvider,我想我只是更新列表中的一项。在这一行中,我修改了这样一个项目的属性,该属性引发了一个更新事件,而更新事件又被传递到ListCollectionViews。您将不得不共享更多的代码,也许可以通过编辑您的问题并提供更多的细节。