Здравствуйте. Подскажите кто знает, бьюсь второй день, перечитал уже все что только можно.
Имеем TreePanel и textfield.
Когда пользователь что-то вводит в текстовое поле, дерево необходимо отфильтровать и оставить видимыми только те узлы, в названии которых содержится введенный текст.
Аналогичная ситуация с гридом решилась просто — фильтрацией стора. Но TreeStore не имеет метода filter. Как скрыть узел — тоже не нашел. В сети находил несколько решений, но все они были для ExtJS 3.
Вопрос собственно в том, как отфильтровать TreeStore на клиенте или как скрыть узел дерева (отфильтрую сам тогда). Создается впечатление, что я фантастически туплю, задача должна решаться каким-то простым и понятным способом.
Это не очень-то и простая операция, не понятно, что делать с дочерними узлами если корень отфильтрован. Но в любом, случае ExtJS4 API говорит, что в конфигах у Ext.data.TreeStore есть filters. Если по каким-то причинам он вам не подойдет, вы всегда можете просто рекурсивно проходить по дереву и прятать/показывать все, что вам нужно.
Ну, фильтровать нужно именно листья, так что тут все просто.
а по поводу filters, в документации написано:
«The collection of Filters currently applied to this Store»
Я так понял, коллекция содержит фильтры, уже примененные к стору при загрузке. Пробовал добавить в коллекцию еще один фильтр, уже после того, как данные загружены и дерево отрисовано — ничего не произошло.
«вы всегда можете просто рекурсивно проходить по дереву и прятать/показывать все, что вам нужно.»
В том-то и беда, что я с удовольствием бы ходил по дереву, но вот как по-человечески спрятать-показать ноду, так и не понял пока.
Кроме как приведенным выше способом. Но там косяки какие-то тоже, cascadeBy как-то криво заходит в свернутые/скрытые ноды. Точно понять, в чем проблема, не успел, убегать нужно было с работы, завтра посмотрю.
Ну hide/show — все таки костыль, лучше proxy. хотя бы клонировать store, вырезать отфильтрованные ноды, устанавливать новый store в treepanel. Там с их proxy, может быть проблемней реализовать.