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
來達到此目的,但我希望不必子類化任何東西。
ArrayCollection子類ListCollectionView。你可能會發現,如果你可以讓一個AC包裝另一個AC而不是一個Array,你可以像預期的那樣使它工作。 –
不能這樣工作AFAIK。 AC需要一個陣列,如你所說。您可以通過調用AC#toArray獲取已過濾AC的*快照*,但在快照後不會接收更新。 –
您可能可以在新AC上設置List屬性 –