PDA

Просмотр полной версии : Как отфильтровать List не затрагивая dataProvider?


bw_left
08.04.2010, 18:09
если dataProvider представлен каким-нибудь collection у него действительно есть filterFunction, но вот возникла такая ситуация:

создаем новую группу, в списке групп она ессно появляется, но вот пока от сервера не получен ID этой группы (по сути пока она не появиться в БД на стороне сервера) нельзя чтобы она отображалась как доступная в списке групп при создании пользователя. источник dataProvider для всех, кто использует эту группу, ессно один, и поэтому отфильтровать эту группу на уровне dataProvider мы не можем. Как лишней крови отфильтровать на уровне самого List.

У List есть ItemRenderer ... вот если бы его где-нить на входе воткнуть "return false" и он пропустил бы этот элемент ..... но я такого способа не знаю :(

Добавлено через 29 минут
Можно конечно создать отдельный Collection на основании исходного и фильтровать его, но придется делать дополнительную связку, которая будет обновлять этот клон ... наверное :rolleyes:

BeDLiNt
09.04.2010, 08:25
Добавляйте новую группу в вашу коллекцию после того как прийдет result от сервера о удачном добавлении с id-шником элемента.

bw_left
09.04.2010, 10:49
немного не то ...

еще раз поясню друими словами и схемкой:

источник групп для списка отображения самих групп и для списка выбора групп у пользователя - один! Но пока группа не сохраниться на сервере (т.е. ее id будет 0) она не должна быть доступна у пользователей. Фильтровать на уровне общего AC нельзя - группа пропадет из обоих UI List. Создавать для GroupsList (DDL) отдельный AC очень не хочется ... случай не единичный - хочется грамотное решение на будущее.

wvxvw
09.04.2010, 20:50
Не совсем правильное представление о том, что есть collections во фреймворке. Они на самом деле collection view т.е. отображение даты после сортировки, фильтрации и т.п. Так что это нормально отфильтровать один вью реальной колекции и отдать этот вью одному компоненту, и с другими настройками его же отдать другому компоненту. С другой стороны, техническая сторона реализации этого дела оставляет желать много лучшего.
http://livedocs.adobe.com/flex/3/langref/mx/collections/ListCollectionView.html#filterFunction
Вот, собственно, чем предлагается фильтровать вью коллекции во фреймворке, но, я даже не знаю, я их просто на столько не люблю, что просто писал бы полностью свое с нуля.

bw_left
09.04.2010, 21:05
мне во фреймворке много что не нравиться - особенно реализация Tree - руки бы оборвать ... но переписывать с нуля - времени нет (((

Насчет коллекций - как я понял из всего прочитанного в Reference, Collections все таки служат больше не для view а для отслеживания изменений производимых над коллекцией, но не берусь это утверждать ибо опыта маловато будет (за что купил, за то продаю - все вопросы к Reference) ... НО!!! допускаю, что и для sort + filtering в том числе

Из опыта могу сказать, что тот же XML вообще можно в коллекцию не оборачивать - он каким-то магическим образом сам всех информирует об произошедших в нем изменениях .. причем о любых - много с тестами игрался, был приятно удивлен.

Возвращаясь к вопросу - так как отменить ItemRenderer для некой записи? (если это вообще возможно) ООО!!!! А еще круче подменить его - вообще роскошно было бы!!! .. и было бы всем счастье и не былоб войны

wvxvw
09.04.2010, 21:11
Ну дык, передали функцию типа:
function filterBadObjects(object:Object):Boolean { return object is BadObject; }
И все плохие объекты не попадут во вью.
XML может информировать об изменениях если вы используете XML#notification() / XML.setNotofications(func:Function). Но если вы этот XML уже используете во фреймворковском проекте, то не делайте этого, т.как извещения могут высылаться только одному подписчику, и если вы используете эту возможность, вы, тем самым отпишите этот XML от всех биндингов которые к нему были добавлены.

bw_left
09.04.2010, 21:16
тут подумал вот что:

для List источником в dataProvider является видимо что-то внутри Коллекции ... я просто не разбирался что именно (отфильтрованные данные где-то ведь лежат)

Посему - можно расширить AC и прикрутить к нему механизм, который просто для каждого List будет подсовывать необходимый отфильтрованый "source". Как сделать - пока не думал - но сама концепция мне пока нравиться. Переопределение фильтрации и сортировки - задача достаточно тривиальная и безкровная мне кажется ))

wvxvw
10.04.2010, 14:01
Ну так это уже сделано в ListCollectionView... А когда вы назначаете провайдера, то если он не является вью коллекции, то компонент его сам оборачивает в этот вью. Хотя, опять же, как на мой взгляд, такой подход излишне замороченый, но, если мы говорим о фреймворковских компонентах, и нам их обязательно использовать, то он там уже есть. На мой взгляд, это мнимое удобство, которое в итоге приведет к тому, что систему будет тяжело поддерживать и всяким разным дтугим конфликтам и непоняткам. Лучше просто выдать каждому компоненту по коллекции - так будет проще, следовательно, меньше багов и другого рода непоняток.