Первоклассная цепочка ListCollectionView не отражает изменений в фильтре в исходной коллекции - PullRequest
1 голос
/ 08 декабря 2011

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

Если я добавлю новый объект Matt в source, 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 голосов
/ 08 декабря 2011

Я бы не ожидал, что это так сработает.Я ожидаю, что источник как ArrayCollection (который является LisCollectionView), так и explict ListCollectionView будут идентичны, с их фильтрами, работающими независимо.

Однако, если вы покопаетесь в исходном коде для этих двух классов, вы можете обнаружить, что либо фильтрация AC не отправляет событие CollectionChange (сомнительно, поскольку требует обновления), либо LCV не 'Прислушайтесь к событию и обновлению.

Если вы сначала примените фильтр к списку, а затем создадите ListCollectionView, увидите ли вы ожидаемые результаты?Если нет, то я думаю, что вы неправильно поняли, как это должно работать.Если да, то у меня есть; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...