Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角JS自定义过滤器_Javascript_Angularjs_Angularjs Filter - Fatal编程技术网

Javascript 角JS自定义过滤器

Javascript 角JS自定义过滤器,javascript,angularjs,angularjs-filter,Javascript,Angularjs,Angularjs Filter,首先,一点背景知识。基本上,我正在使用ng repeat渲染表中的对象列表。我的过滤器需要能够获取一个搜索字符串,并检查正在重复的对象中的每个搜索词。每个搜索词都需要(以任何顺序)出现在任何对象属性中,以便筛选器通过该对象。例如,如果对象看起来像这样: { customer: 'John Smith', detail: 'Some details' } 我的搜索文本是smith john或details john smith或smith john details,它需要能够以任

首先,一点背景知识。基本上,我正在使用ng repeat渲染表中的对象列表。我的过滤器需要能够获取一个搜索字符串,并检查正在重复的对象中的每个搜索词。每个搜索词都需要(以任何顺序)出现在任何对象属性中,以便筛选器通过该对象。例如,如果对象看起来像这样:

{
    customer: 'John Smith',
    detail: 'Some details'
}
我的搜索文本是
smith john
details john smith
smith john details
,它需要能够以任何顺序获取这些术语,并找到匹配的对象。上面的对象应该匹配,因为所有搜索词都存在

我编写的过滤器如下所示:

angular.module('app').filter('assetsearch', function () {
return function (input, searchString) {

    var searchTerms = searchString === '' ? [] : searchString.replace(/  +/g, ' ').replace(/[^\w\s]|_/g, '').toLowerCase().split(' ');

    var matches = _.filter(input, function (asset) {
        var textToSearch = [
            asset.customer,
            asset.details
        ];

        textToSearch = textToSearch.join(' ').replace(/  +/g, ' ').replace(/[^\w\s]|_/g, "").toLowerCase();

        var match = true;
        _.each(searchTerms, function (term) {
            match = (textToSearch.trim().indexOf(term) > -1) && match;
        });

        return match;
    });

    return matches;
}
});
我的模板代码看起来非常标准,其中
$ctrl
表示模板的组件控制器:

<tr ng-repeat="asset in $ctrl.assets | assetsearch:$ctrl.filters.search" ng-if="!asset.loading">

结果


当我搜索“John Smith”、“John”或“Smith”时,它会工作-当我反转字符串时,它只是拒绝工作。。。当字符串反转为“Smith John”或更改为“Joh Smith”时,筛选器似乎根本不会被触发(在这种情况下,筛选器函数开头的控制台日志不会运行,因此它似乎什么都没有做)。

我将避免使用下划线和类似
replace()的方法
使用angularjs对嵌套的forEach循环执行更简单的操作。过滤器将被重写,如下所示:

app.filter('assetsearch', function() {
  return function(input, term) {
    var obj = {};
    if (typeof term !== 'undefined') {
      angular.forEach(input, function(v, i){
        var terms = term.split(" ");
        angular.forEach(terms, function(v2, i2){
          if( v.toLowerCase().indexOf(v2.toLowerCase()) !== -1){
            obj[i] = v;
          }
        });
      }); 
    } else {
      return input; 
    }
    return obj;
  };
});
我还创建了一个示例来展示它在真实环境中的工作方式