簡體   English   中英

Flex中dataProvider更新時,selectedItem已刪除

[英]selectedItem erased on dataProvider update in Flex

flex中 ,我正在使用一個組件,該組件顯示其dataProvider( ListCollectionView )中的特定項目(selectedItem字段)。

我的dataProvider的元素可以通過不同的方式進行編輯。 每次編輯時,都會發送一個更新事件,從而導致更新dataProvider集合(ListCollectionView :: listChangeHandler )。

在此過程中,如果我的selectedItem是edited元素,則將其刪除(通過ListCollectionView :: moveItemInView設置為null),即使未在任何地方使用edited字段也是如此。

有辦法避免這種情況嗎?

更具體地說,不必先保存它,而將其丟失然后再恢復(在此幾乎不可行)


編輯:好的,我想我可以進一步解釋:

在我的代碼中,我對數據綁定到dataProvider的列表項之一的屬性產生了影響。 我不知道為什么,可能是因為該項目的類是[可綁定],這引發了更新事件。

該事件由ArrayList :: itemUpdateHandler捕獲,該事件將其分派到ListCollectionView :: listChangeHandler。 在這一點上,事件“種類”是“更新”,對我來說似乎沒問題……

但是從那里開始,它轉到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

那是個錯誤嗎?

您如何更新dataProvider? 如果是這個

list.dataProvider = newDataProvider

然后,您看到的行為是預期的。 從List角度來看,您已經完全替換了dataProvider,並且List無法知道舊的selectedItem / selectedIndex是否仍然有效。 我認為這是正確的假設。

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

list.dataProvider.refresh();

在這種情況下,dataProvider的長度可能會改變; 以及它的元素。 在這種情況下,將分派collectionChange事件,並且列表應具有處理collectionChange事件的方法。 列表無法知道先前選擇的項目是否將在新列表中; 它的索引是否會更改,或者即使舊的selectedIndex仍然有效。 因此,selectedItem被重置。

通常,無論在哪種情況下都要保留selectedItem / selectedIndex,您應該存儲對其的引用,並在dataProvider更改后將其重置:

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

如果您只是在dataProvider中更新項目; 那么selectedIndex / selectedItem不會受到影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM