2011-10-08 58 views
2

我在我的树形工具栏中有一个文本框,它应该从用户处获取一个字符串,然后通过特定的树列进行搜索。我使用商店过滤器,但在我的代码中存在问题,我不知道它是什么。感谢帮助。 这是我的代码:在extjs树店内搜索

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 
    }); 
    } 
}; 
+0

对我的问题有任何意见? –

+0

调试它。如果在filter()调用中将searchReg替换为硬编码值,它是否工作? –

+0

我做了,它没有,我认为没有实现树存储过滤器,这是假的!我现在应该怎么做?如何在商店中过滤我的数据? :( –

回答

0

你可以走了所有的子树中的节点,而不是通过商店去。树的所有节点都实施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。因此,教师树模型不保存在数据库中,而仅保存在教师模型中。发现在许多情况下更容易。

2

Ext.data.TreeStore中没有filter方法(假设您使用4.x,我使用4.1.3)。 也许这将帮助你: Ext JS 4: Filtering a TreeStore

或者,你可以尝试这样的事:


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

并希望进行最后一次编辑:-) 在这个线程在煎茶论坛上,他们建议你在根节点上使用CascadeBy。与上面的代码大致相同。

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