Являются ли фильтры dstore накопительными, и как правильно расположить отфильтрованное дерево
Я бегал кругами какое-то время, пытаясь впервые использовать dstore с dgrid. У меня есть несколько лет опыта работы со старым подходом dojo/store с dgrid 0.3. Теперь с dstore 1.1.2 и dgrid 1.2.1 (все, что мне кажется последним), я нахожу, что в документации не ясно указано, как в ситуации с внутренней фильтрацией, например в хранилище, использующем dgrid/Tree, будут включены дополнительные фильтры. Я подумал, что лучше всего обратиться за советом, потому что я в замешательстве.
Я могу получить базовый список и работающий dgrid / Tree с моим хранилищем данных. Функция getRootCollection() возвращает хранилище, отфильтрованное так, чтобы оно возвращало "элементы без родителя", то есть верхние узлы дерева. Затем getChildren() возвращает дочерние элементы для выбранного узла. то есть что-то вроде:
getRootCollection: function () {
return this.root.filter({parent_id: 0});
},
getChildren: function(parent, options){
return this.root.filter(new Filter().eq(parent, this.getIdentity(parent)));
}
Это все работает нормально, пока мне не нужно добавить дополнительные фильтры. Я думаю, что корень моей проблемы в том, чтобы понять, где дополнительные фильтры, например, name = 'jim'
будет применяться.. можно просто использовать store.filter({name: 'jim'})
и имеют неизмененные getRootCollection()
/getChildren()
функции возвращают отфильтрованные коллекции, как указано выше? Или вам придется повторно предоставить магазин в сетку после применения этого фильтра? Или нужно изменить обе эти функции, чтобы возвращаемая коллекция также фильтровалась {name: 'jim'}
? В какой момент grid.refresh()
быть обязательным? Что делать, если, скажем, 3 фильтра применяются, как {name: 'jim'}
, {age: 25}
, {color: 'blue'}
.. когда один фильтр меняется, можете ли вы применить его изменение независимо, или вам нужно будет восстановить соединение Filter()
и применить его снова.. в магазин? сетка?
Чтобы добавить пользовательскую фильтрацию, я начал с примера, такого как https://gavinr.com/2015/04/07/dojo-dgrid-filter/ где у него есть цикл над полями для фильтрации, вызывая new Filter().or
построить серию логических тестов в одном фильтре. Это имеет смысл, но я не вижу, как применить этот подход, когда getRootCollection()
имеет собственный встроенный фильтр (parent_id: 0) и getChildren()
также есть фильтр (parent_id: parent.id).
Моя конечная цель - иметь приложение с:
- Опция Список / Дерево, чтобы показать либо плоский список, либо дерево
- Несколько текстовых полей для фильтрации различных полей моих объектов, например
name = 'jim'
Я построил скрипку на https://jsfiddle.net/neekfenwick/0q57h2r3/2/ чтобы попытаться обобщить мою отправную точку. Он может переключаться между сетками "Список" и "Дерево" и пытается применить фильтр текста, надеюсь, полезную отправную точку для обсуждения, очевидно, что любые реальные ответы принадлежат здесь в разделе "Ответы и комментарии".