2011-10-08 3 views
2

J'ai un champ de texte dans ma barre d'outils de l'arbre qui devrait prendre une chaîne d'un utilisateur puis la rechercher dans une colonne d'arbre spécifique. J'utilise le filtre de magasin mais il y a un problème dans mon code et je ne sais pas ce que c'est. Merci pour l'aide. Voici mon code:Recherche à l'intérieur du magasin d'arbres 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

des commentaires pour mon problème? –

+0

le déboguer. Si vous remplacez searchReg dans l'appel filter() avec une valeur codée en dur, cela fonctionne-t-il? –

+0

Je l'ai fait, ça ne marche pas, je pense qu'il n'y a pas de mise en œuvre pour le filtre du magasin d'arbre, c'est faux! Qu'est-ce que je devrais faire maintenant? comment filtrer mes données en magasin? :( –

Répondre

0

Vous pouvez marcher sur tous les nœuds enfants dans l'arbre au lieu de passer par le magasin. Tous les nœuds de l'arbre implémentent le TreeNodeInterface qui a les méthodes dont vous avez besoin. La méthode cascadeBy est probablement ce que vous cherchez. Il appellera une fonction récursivement sur chaque nœud enfant d'un nœud. C'est essentiellement la même chose qu'un filtre pour un magasin, mais il connaît la hiérarchie de l'arbre.

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); 

Vous pouvez également rechercher d'autres champs dans childNode. Habituellement, les nœuds que je garde dans les arbres ont un modèle différent. Si j'ai un modèle teacher qui est affiché dans un arbre, j'ai un teacherTreeModel qui a un teacher. Ainsi, le modèle de l'arbre enseignant n'est pas sauvegardé dans la base de données, seul le modèle de l'enseignant. Trouvé que pour être plus facile dans de nombreux cas.

2

Il n'y a pas de méthode filter dans Ext.data.TreeStore (en supposant que vous utilisez 4.x, j'utilise 4.1.3). Peut-être que cela vous aidera: Ext JS 4: Filtering a TreeStore

Sinon, vous pouvez essayer quelque chose comme ceci:


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

Et je l'espère une dernière édition :-) Dans ce fil dans les forums Sencha, ils vous suggérez utilisez CascadeBy sur le nœud racine. Fonctionne de la même manière que le code ci-dessus plus ou moins.

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

Questions connexes