我有一个ng-repeat
上的过滤器,并将所有对象(包括嵌套的对象)的字符串与搜索字符串进行比较。如果在对象中找到搜索字符串,则返回true。
我正在寻找一种扩展此功能的方法,以便当搜索字符串与对象中的字符串匹配时,过滤器将为该对象返回true,并对匹配对象中的所有嵌套对象返回true(this是树视图,我正在搜索节点,并希望在匹配时显示所有子节点。
我该怎么做?
我的过滤器如下所示:
.filter('deepFilter', function ($filter) {
return function(text) {
return function (value) {
if(text && text.length > 0) {
var searchTerm = text;
if (angular.isObject(value)) {
var found = false;
angular.forEach(value, function(v) {
found = found || $filter('deepFilter')(searchTerm)(v);
});
return found;
} else if (angular.isString(value)) {
if (value.indexOf(searchTerm) !== -1) {
return true;
} else {
return false;
}
}
} else {
return true;
}
};
};
});
答案 0 :(得分:0)
我找到的解决方案是使用过滤器的isString
部分中的函数,并迭代集合。如果我找到了这个对象,我会使用递归函数查找它的子项并为它们设置visibleAsAChild
属性。然后,我在isObject
评估中添加了一个条件,以返回true
这些具有visibleAsAChild
道具的对象。
我不确定这是否是最有效的方法,但它肯定有效。
.filter('deepFilter', function ($filter) {
var currentObject;
var setChildrenToVisible = function(node) {
angular.forEach(node.nodes, function(node) {
if(node.nodes) {
setChildrenToVisible(node);
}
node.visibleAsAChild = true;
});
};
var lookupChildren = function(o, value) {
// console.log(o);
angular.forEach(o.nodes, function(node) {
if (node.name === value) {
setChildrenToVisible(node);
}
});
};
return function(text) {
return function (value) {
if(text && text.length > 0) {
var searchTerm = text;
if (angular.isObject(value)) {
var found = false;
angular.forEach(value, function(v) {
found = found || $filter('deepFilter')(searchTerm)(v);
});
if(found && value.hasOwnProperty('id')) {
currentObject = value;
}
if(value.hasOwnProperty('id') && value.visibleAsAChild) {
return true;
}
return found;
} else if (angular.isString(value)) {
if (value.indexOf(searchTerm) !== -1) {
if(currentObject){
lookupChildren(currentObject, value);
}
return true;
} else {
return false;
}
}
} else {
return true;
}
};
};