Поиск внутри магазина дерева extjs - PullRequest
2 голосов
/ 08 октября 2011

У меня есть текстовое поле на панели инструментов моего дерева, которое должно взять строку у пользователя, а затем выполнить поиск в определенном столбце дерева.Я использую фильтр магазина, но в моем коде есть проблема, и я не знаю, что это такое.Спасибо за помощь.Это мой код:

var onSimpleSearch = function(){
 var searchStr= Ext.getCmp('searchField').getValue();
   if(searchStr){
    var tree = Ext.getCmp('infra_tree');
    var tstore = tree.getStore();
    var searchReg = new RegExp(".*" + searchStr + ".*", "ig");
    console.log(searchReg); //return RegExp!!!!!!!
    tstore.filter("ipadd", searchReg});
}else {
    Ext.MessageBox.show({
        title: 'Nothing to search',
        msg: 'Search string is empty',
        icon : 'ext-mb-info',
        buttons: Ext.MessageBox.OK
    });
  }
};

Ответы [ 3 ]

2 голосов
/ 10 сентября 2013

В Ext.data.TreeStore нет метода filter (при условии, что вы используете 4.x, я использую 4.1.3).Может быть, это поможет вам: Ext JS 4: фильтрация TreeStore

В качестве альтернативы, вы можете попробовать что-то вроде этого:


var nodeToSearchFor = treestore.getRootNode().findChildBy(function(node) {
    return (node.data['fieldToSearchFor'] == valueToSearchFor);
});

И, надеюсь, одно последнее редактирование: -) В этой теме на форумах Sencha вам предлагают использовать CascadeBy на корневом узле.Работает так же, как приведенный выше код более или менее.

http://www.sencha.com/forum/showthread.php?150060-Search-inside-extjs-tree-store

0 голосов
/ 15 января 2019

У меня были те же вопросы, и я только нашел скрипку, которая решает проблему "поиска в магазине дерева". Я не знаю, кто это написал, но это жемчужина. Он работает здесь: https - добавить косую черту в виде двоеточия - fiddle.sencha.com/#fiddle/ra&view/editor (Я попытался включить исходный код скрипки в ответ, но редактор переполнения стека не позволяет мне.)

0 голосов
/ 30 июня 2013

Вы можете пройтись по всем дочерним узлам в дереве вместо того, чтобы пройти через магазин. Все узлы дерева реализуют TreeNodeInterface , который имеет необходимые методы. cascadeBy метод, вероятно, то, что вы ищете. Он будет вызывать функцию рекурсивно на каждом дочернем узле узла. По сути, это то же самое, что и фильтр для магазина, но он знает об иерархии дерева.

var searchStr = Ext.getCmp('searchField').getValue();
var matchingNodes = [];

var tree = Ext.getCmp('infra_tree'); 
// You could get the selected node, or any other node as start node.
// I take the root node as example.
var startNode = tree.getRootNode();

startNode.cascadeBy(function (childNode) {
    if (childNode.get('text') == searchStr)
    {
       matchingNodes.push(childNode);
    }
}, this);

Вы также можете искать любое другое поле в childNode. Обычно у тех узлов, которые я держу в деревьях, другая модель. Если у меня есть модель teacher, отображаемая в дереве, у меня есть teacherTreeModel с teacher. Таким образом, модель дерева учителя не сохраняется в базе данных, а только модель учителя. Обнаружено, что во многих случаях это проще.

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