【问题标题】:Angular: custom filter for recursive search in nested objectAngular:用于在嵌套对象中进行递归搜索的自定义过滤器
【发布时间】:2016-09-28 08:16:14
【问题描述】:

我在过滤嵌套对象时遇到了一些问题。在选择中,我选择过滤器参数(对象值),在输入中我键入一些在对象键中搜索它的文本。
尝试使用递归编写自定义过滤器以进行深度搜索,但它不起作用。 input 是 ng-repeat 中对象的参数,param1 是 select 的 ng-model,param2 是 input 的 ng-model。


JS

  .filter('personFilter', function($filter) {
    return function(input, param1, param2) {
      var output = {};
      for (var prop in input) {
          if (typeof input[prop] == 'object' || prop != param1 && input[prop] != param2) {
              $filter('personFilter')(input[prop]);
          } else {
              output[key] = input[key];
          }
      }
      return output;
    }


这是 plunker:http://plnkr.co/edit/83lPNRWFy6wa9U2FkMfH?p=preview
希望有人给我一些建议

【问题讨论】:

  • 似乎数据格式无效。你应该得到一个像Uncaught SyntaxError: Unexpected token :这样的错误,因为格式可能像[{'node1': {node2: ''}}]而不是['node1': {...}]

标签: angularjs


【解决方案1】:

对不起,只是肮脏的解决方案,没有时间重构。 Mb 它为您节省时间

.filter('personFilter', function($filter) {
    return function(input, recursive, search) {
          return input.filter(filterFn);
          function filterFn(obj){
            var val, res;
            for (var prop in obj) {
                val = obj[prop];
                if (typeof val == 'object' && recursive) {
                    recursive = false;
                    res = res || val.filter(filterFn).length;
                    recursive = true;
                } else if(!recursive){
                    res = res || val == search;
                }
            }
            console.log(res, obj, recursive, search);
            return res;
          }

        }

带有以下标记

<body ng-controller="appCtrl">
    <select ng-model="selectParameter" ng-options="item.value as item.key for item in parameter track by item.value">      
    </select>
    <input ng-model="query" />

    <div ng-repeat="person in object.node1.node2.persons | personFilter:selectParameter:query track by $index">
     <!--   -->
        <p>Person: {{person.name}}, Children: <span ng-repeat="child in person.children track by $index">{{child.name}}, </span></p>
    </div>
  </body>

和控制器初始化像:

$scope.parameter = [
      {value: false, key: 'Person Name'},
      {value: true, key: 'Child Name'}
];
$scope.selectParameter = true;

【讨论】:

  • 嗨,它的工作原理很奇怪 :) plnkr.co/edit/wGeYk7OuFGCMc56usjk1?p=preview
  • 什么意思?
  • 见小插曲
  • 我看到了。下怪是什么意思?
  • 即使在控制台中我也没有正确过滤。如果我尝试按名字查找并输入“Peter”,它也会显示“Martin”。如果我有两个以上的选择选项?选项值有真假之分。
猜你喜欢
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多