以下是实现代码:
var matched = [];
var treeFilter = new Ext.tree.TreeFilter(this.agencyTree, {
clearBlank : true,
autoClear : true
});
function search() {
var text = seachField.getValue();//seachField为TextField输入框对象
treeFilter.clear();//treeFilter过滤条件
matched = [];//匹配的节点
// 如果输入的数据不存在,就执行clear()
if (!text) {
return;
}
tree.expandAll();
// 根据输入制作一个正则表达式,'i'代表不区分大小写
var re = new RegExp(Ext.escapeRe(text), 'i');
// 找出所有匹配的结点
tree.root.cascade(function(n) {
if (re.test(n.attributes['text'])) {
matched.push(n);
}
}, this);
// 从每个叶子结点向根方向处理,处理所有结点的枝叶,
// 如果该枝叶包含匹配的结点,则保留,否则裁剪掉(隐藏)
tree.root.cascade(function(n) {
if (n.isLeaf()) {
// 处理每一条子结点路径
n.bubble(function(nbb) {
// 从叶子到根,逐个剪掉
var contain = false;
for (var mted = 0; mted < matched.length; mted++) {
if (nbb.contains(matched[mted]) || nbb == matched[mted]) {
// 包含匹配的结点
contain = true;
break;
}
}
// 把不包含匹配结点的结点隐藏
if (!contain) {
nbb.ui.hide();
treeFilter.filtered[nbb.id] = nbb;
}
}, this);
}
}, this);
};