2011-10-08 4 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

나는 그것을했다, 나 doesnt, 나는 트리 스토어 필터를 위해 구현하지 않는다고 생각한다, 그것은 가짜이다! 나는 지금 무엇을해야합니까? 저장소의 데이터를 필터링하는 방법은 무엇입니까? :( –

답변

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 모델의 경우 teacherTreeModelteacher이 있습니다. 따라서 교사 트리 모델은 데이터베이스에 저장되지 않고 교사 모델에만 저장됩니다. 많은 경우에 더 쉬워 진 것을 발견했습니다.

2

Ext.data.TreeStorefilter 방법이 없습니다 (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