2016-09-28 3 views
0

У меня есть проблема с фильтром вложенного объекта. В элементе выбора я выбираю параметр фильтра (значение объекта), а во входе I набираю текст, который ищет его в объектном ключе.
Пытался написать собственный фильтр с рекурсией для глубокого поиска, но он не работает. input - параметр для объекта в ng-repeat, param1 - для ng-модели select, а param2 - для ng-модели ввода.Угловой: настраиваемый фильтр для рекурсивного поиска в вложенном объекте


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
Я надеюсь, что кто-то дать мне несколько советов

+1

кажется, формат данных не является действительным. вы должны получить сообщение об ошибке «Uncaught SyntaxError: Неожиданный токен:' потому что формат может быть как-то вроде '[{'node1': {node2: ''}}]' not '['node1': {...}]' –

ответ

0

извините, просто грязный раствор, нет времени, чтобы реорганизовать. Мб это сэкономить время вам

.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; 
+0

Привет, он работает странно :) http://plnkr.co/edit/wGeYk7OuFGCMc56usjk1?p=preview – kipris

+0

Что вы имеете в виду? –

+0

Смотрите plunker – kipris

Смежные вопросы