2011-12-08 53 views
1

ListCollectionView經常被提升爲將相同數據的不同視圖進行菊花鏈連接的好方法。您有一些源集合,然後使用ListCollectionView + filterFunction來封裝源數據並呈現該源集合的一個子集。當源集合更改(添加或刪除)時,鏈接的LCV會自動更新。但是,如果對源收集變化的filterFunction,它不會出現傳播到鏈接的LCV:如果我添加一個新的馬特對象source菊花鏈式ListCollectionView不反映源集合中過濾器的更改

ArrayCollection source = new ArrayCollection(new Array({name: 'Matt'}, {name: 'John'}, {name: 'Zach'})); 
ListCollectionView justMatts = new ListCollectionView(source); 
justMatts.filterFunction(function(obj: Object):Boolean { obj.name == 'Matt' }); 
justMatts.refresh(); 

justMatts將拿起變化並重新運行它按預期過濾。

但是,如果我添加了一個篩選source排除馬特對象,justMatts不拿起更改爲源的過濾器:

source.filterFunction(function(obj: Object):Boolean { obj.name != 'Matt' }); 
source.refresh(); 

在這一點上,我希望justMatts接收CollectionChangeEvent並重新運行其過濾器。由於所有Matts都已從source對象中過濾出來,因此justMatts也將爲空。但是,如果您查看ListCollectionView的代碼,則它們不會處理CollectionEventKind.REFRESH,這是source獲得新濾波器時觸發的內容。我在這裏做錯了什麼(使用錯誤的類等),或者什麼都不支持對source篩選器的更改。

我可以通過在source上手動調度CollectionEventKind.RESET來達到此目的,但我希望不必子類化任何東西。

+0

ArrayCollection子類ListCollectionView。你可能會發現,如果你可以讓一個AC包裝另一個AC而不是一個Array,你可以像預期的那樣使它工作。 –

+0

不能這樣工作AFAIK。 AC需要一個陣列,如你所說。您可以通過調用AC#toArray獲取已過濾AC的*快照*,但在快照後不會接收更新。 –

+0

您可能可以在新AC上設置List屬性 –

回答

0

我不希望它能像那樣工作。我期望ArrayCollection(這是一個LisCollectionView)和顯式ListCollectionView的來源是相同的,他們的過濾器獨立運行。但是,如果您在這兩個類的源代碼中查找,您可能會發現,要麼過濾AC不會派發CollectionChange事件(可疑,因爲它需要刷新),或者LCV不聽爲事件和更新。

如果您先將過濾器應用於列表,然後製作ListCollectionView,您是否看到您期望的結果?如果沒有,那麼我認爲你誤解了這應該如何工作。如果你這樣做,那麼我有;-)

+0

如果您先將過濾器應用於源,然後創建LCV(如您所說),則LCV正在*過濾的源*上操作,而不是原始源。例如,如果我使用一個總是返回false的filterFunction過濾源,鏈接集合也將一直爲空。整篇博客文章(http://graemeharker.blogspot.com/2009/04/implementing-presentation-model-in-flex.html)基於的前提是您可以鏈接這些過濾器。 –

+0

然後,您可能需要在LCV內部探索並瞭解爲什麼它不會對收集更改事件做出反應。請注意,在您指向的博客文章中,您嘗試執行的方式沒有菊花鏈。基礎交流是獨立的,而排序和過濾器基於它應用於LCV。 –