菊花链式ListCollectionView不反映源集合中过滤器的更改

时间:2011-12-08 17:27:04

标签: flex listcollectionview

ListCollectionView通常被提升为菊花链相同数据的不同视图的好方法。您有一些源集合,然后使用ListCollectionView + filterFunction来包装源数据并呈现该源集合的子集。当源集合发生更改(添加或删除)时,链接的LCV会自动更新。但是,如果源集合的filterFunction发生更改,则它似乎不会传播到链式LCV:

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();

如果我向source添加新的Matt对象,justMatts将接收该更改并按预期重新运行其过滤器。

但是,如果我向source添加过滤器以排除Matt对象,则justMatts不会对源过滤器进行更改:

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

此时,我希望justMatts收到CollectionChangeEvent并重新运行其过滤器。由于所有Matts都已从source对象中过滤掉,因此justMatts也将为空。但是,如果您查看ListCollectionView代码,它们就不会处理CollectionEventKind.REFRESH,这会在source应用新过滤器时触发。我在这里做错了(使用错误的类等)或者在Flex中没有做任何事情支持对source过滤器的更改。

我可以通过在CollectionEventKind.RESET上手动调度source来实现此功能,但我希望不必将任何内容子类化。

1 个答案:

答案 0 :(得分:0)

我不希望它完全像那样工作。我希望ArrayCollection(它是一个LisCollectionView)和explict ListCollectionView的源都是相同的,它们的过滤器是独立运行的。

但是,如果你在这两个类的源代码中徘徊,你可能会发现过滤AC不会调度CollectionChange事件(可疑,因为它需要刷新),或者LCV不会监听事件和更新。

如果您首先将过滤器应用于列表,然后生成ListCollectionView,您是否看到了预期的结果?如果没有,那么我认为你误读了它应该如何工作。如果你这样做,那么我有; - )