Angular Js Smart Table 使用自定义过滤器搜索多词过滤器 space
Angular Js Smart Table custom filter to search muti word filter using space
过去五个小时我一直在努力处理自定义过滤器指令。我是 angularjs 的初学者。
我有一个 table 除了过滤器之外的所有需求。我想在单个搜索文本框中使用 space 进行全局多字符串过滤器。
这是我的代码:
app.filter('multiWordFilter', ['$filter', function ($filter) {
// function that's invoked each time Angular runs $digest()
return function (input, predicate) {
var searchValue = predicate['$'];
//console.log(searchValue);
var customPredicate = function (value, index, array) {
console.log(value);
// alert(searchValue);
// if filter has no value, return true for each element of the input array
if (typeof searchValue === 'undefined') {
return true;
}
var propList = Object.getOwnPropertyNames(value) || [];
var splitValue = (searchValue || '').split(' ');
var resultArray = [];
for (var i = 0; i < propList.length; i++) {
var prop = propList[i];
if (typeof value[prop] !== 'string')
continue;
for (var j = 0; j < splitValue.length; j++) {
var searchText = splitValue[j];
if (!searchText)
continue;
var index = (String)(value[prop]).toLowerCase().indexOf(searchText.toLowerCase());
if (index > -1) {
trueList.push(true);
break;
}
}
}
return trueList.length
}
return $filter('filter')(input, customPredicate, false);
}
}])
以上代码仅适用于单个字符串搜索,我还尝试使用 space 拆分多个字符串
对于前
|姓名|联系电话|
|:阿斯拉夫|8765270810|
|:内存|8765270810|
搜索词如 8754270810 Asraf
只有 return 第一个搜索结果而不是第二个。
我很期待
搜索词如8754270810将return两条记录
搜索词如 8754270810 Asraf 将 return 一条记录
在此先感谢大家。
我找到了解决上述问题的方法。
app.filter('multiWordFilter', ['$filter', function ($filter) {
// function that's invoked each time Angular runs $digest()
return function (input, predicate) {
var searchValue = predicate['$'];
var customPredicate = function (value, index, array) {
// if filter has no value, return true for each element of the input array
if (typeof searchValue === 'undefined') {
return true;
}
var propList = Object.getOwnPropertyNames(value) || [];
var splitValue = ((String)(searchValue).trim() || '').split(' ');
if (!splitValue.length)
return true;
var searchCount = 0;
for (var j = 0; j < splitValue.length; j++) {
var searchText = splitValue[j];
if (!searchText)
continue;
for (var i = 0; i < propList.length; i++) {
var prop = propList[i];
if (typeof value[prop] !== 'string')
continue;
var index = (String)(value[prop]).toLowerCase().indexOf(searchText.toLowerCase());
if (index > -1) {
searchCount++;
break;
}
}
}
return (searchCount == splitValue.length)
}
return $filter('filter')(input, customPredicate, false);
}
}])
这里当拆分搜索文本值计数和搜索计数相等时,只有匹配的记录可用。
在我的例子中,假设一个网格有 10 行,搜索文本是:'Dog eat'。
现在实际会发生的是,首先使用 Dog 进行过滤,现在我们有 7 行,然后现在使用 eat 在我们已经得到的先前过滤器中进行过滤7 行,最后我们得到 4 行。这就是我真正想要的输出。
谢谢你们花宝贵的时间回答我的问题。
过去五个小时我一直在努力处理自定义过滤器指令。我是 angularjs 的初学者。 我有一个 table 除了过滤器之外的所有需求。我想在单个搜索文本框中使用 space 进行全局多字符串过滤器。 这是我的代码:
app.filter('multiWordFilter', ['$filter', function ($filter) {
// function that's invoked each time Angular runs $digest()
return function (input, predicate) {
var searchValue = predicate['$'];
//console.log(searchValue);
var customPredicate = function (value, index, array) {
console.log(value);
// alert(searchValue);
// if filter has no value, return true for each element of the input array
if (typeof searchValue === 'undefined') {
return true;
}
var propList = Object.getOwnPropertyNames(value) || [];
var splitValue = (searchValue || '').split(' ');
var resultArray = [];
for (var i = 0; i < propList.length; i++) {
var prop = propList[i];
if (typeof value[prop] !== 'string')
continue;
for (var j = 0; j < splitValue.length; j++) {
var searchText = splitValue[j];
if (!searchText)
continue;
var index = (String)(value[prop]).toLowerCase().indexOf(searchText.toLowerCase());
if (index > -1) {
trueList.push(true);
break;
}
}
}
return trueList.length
}
return $filter('filter')(input, customPredicate, false);
}
}])
以上代码仅适用于单个字符串搜索,我还尝试使用 space 拆分多个字符串 对于前 |姓名|联系电话| |:阿斯拉夫|8765270810| |:内存|8765270810|
搜索词如 8754270810 Asraf
只有 return 第一个搜索结果而不是第二个。
我很期待
搜索词如8754270810将return两条记录 搜索词如 8754270810 Asraf 将 return 一条记录
在此先感谢大家。
我找到了解决上述问题的方法。
app.filter('multiWordFilter', ['$filter', function ($filter) {
// function that's invoked each time Angular runs $digest()
return function (input, predicate) {
var searchValue = predicate['$'];
var customPredicate = function (value, index, array) {
// if filter has no value, return true for each element of the input array
if (typeof searchValue === 'undefined') {
return true;
}
var propList = Object.getOwnPropertyNames(value) || [];
var splitValue = ((String)(searchValue).trim() || '').split(' ');
if (!splitValue.length)
return true;
var searchCount = 0;
for (var j = 0; j < splitValue.length; j++) {
var searchText = splitValue[j];
if (!searchText)
continue;
for (var i = 0; i < propList.length; i++) {
var prop = propList[i];
if (typeof value[prop] !== 'string')
continue;
var index = (String)(value[prop]).toLowerCase().indexOf(searchText.toLowerCase());
if (index > -1) {
searchCount++;
break;
}
}
}
return (searchCount == splitValue.length)
}
return $filter('filter')(input, customPredicate, false);
}
}])
这里当拆分搜索文本值计数和搜索计数相等时,只有匹配的记录可用。
在我的例子中,假设一个网格有 10 行,搜索文本是:'Dog eat'。 现在实际会发生的是,首先使用 Dog 进行过滤,现在我们有 7 行,然后现在使用 eat 在我们已经得到的先前过滤器中进行过滤7 行,最后我们得到 4 行。这就是我真正想要的输出。
谢谢你们花宝贵的时间回答我的问题。