2016-09-28 5 views
0

Ich habe ein Problem mit dem Filtern verschachtelter Objekte. In Select wähle ich den Filterparameter (Objektwert) und in Eingabe gebe ich einen Text ein, der ihn im Objektschlüssel sucht.
Versucht, benutzerdefinierte Filter mit Rekursion für tiefe Suche zu schreiben, aber es funktioniert nicht. input ist der Parameter für das Objekt in ng-repeat, param1 ist für selects ng-Modell und param2 ist für das ng-Modell der Eingabe.Angular: benutzerdefinierter Filter für rekursive Suche in verschachtelten Objekt


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; 
    } 


Hier ist der Plunker: http://plnkr.co/edit/83lPNRWFy6wa9U2FkMfH?p=preview
Ich hoffe jemand mir einen Rat geben

+1

wie Datenformat erscheint, ist nicht gültig. Sie sollten einen Fehler wie 'Uncaught SyntaxError: Unexpected token:' bekommen, weil das Format etwas wie '[{'node1': {node2: ''}}]' not '['node1': {...}]' sein kann –

Antwort

0

sorry, nur schmutzige Lösung, haben keine Zeit zu Refactoring. MB ist es Zeit für Sie

.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; 
      } 

     } 

mit folgenden Auszeichnungs

<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> 

und Controller init speichern wie:

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

Hallo, es funktioniert seltsam :) http://plnkr.co/edit/wGeYk7OuFGCMc56usjk1?p=preview – kipris

+0

was meinst du? –

+0

Sehen Sie den Plünderer – kipris

Verwandte Themen