2014-12-22 19 views
46

Wenn ich ein komplexes Objekt mit Objekten als Eigenschaftswerte habe, wie kann ich nach einer der verschachtelten Eigenschaften filtern?ngRepeat Filter nach Deep-Eigenschaft

Kann dies mit dem OOB ng-repeat Filter gemacht werden?

Daten

{ 
    Name: 'John Smith', 
    Manager: { 
    id: 123, 
    Name: 'Bill Lumburg' 
    } 
} 

ngRepeat

<li ng-repeat="e in emps | filter:Manager.Name">{{ e.Name }}</li> 

Antwort

97

Sie müssen in dem Argument übergeben filtern nach:

<input ng-model="filter.key"> 
<ul> 
    <li ng-repeat="e in list | filter: {Manager: {Name: filter.key}}"> 
    {{e.Name}} (Manager: {{e.Manager.Name}}) 
    </li> 
</ul> 

Example on Plunker

+2

Wenn einige Objekte keine Manager Eigenschaft haben, werden sie nicht angezeigt, auch wenn der Filter leer ist. Weißt du, wie man sie einbeziehen kann? – Bludwarf

+1

Was passiert, wenn Name ein Array ist und ich nur den Vornamen filtern möchte? – rocketspacer

+1

@Bludwarf http://pnnr.co/edit/dMbYapbySJMGKiykvpG7?p=preview vielleicht kann dies jemandem helfen – ANinJa

1

In der neuesten Version von angularjs verschachtelter Obj-Filter standardmäßig implementiert.können Filter normal verwenden.

+0

Sehr geehrte @Murali obige Lösung ist nur für eckige 1. –

2

Um mit mehreren tiefen Eigenschaften zu filtern, müssen wir benutzerdefinierte Filter erstellen. Was ich meine, müssen wir eine eigene Funktion erstellen, um die Daten in Objekt zu filtern und das erforderliche Objekt (gefiltertes Objekt) zurückzugeben.

Zum Beispiel muss ich zum Filtern von Daten von unten Objekt -

[ 
{ 
    "document":{ 
     "documentid":"1", 
     "documenttitle":"test 1", 
     "documentdescription":"abcdef" 
     } 
}, 
{ 
    "document":{ 
     "documentid":"2", 
     "documenttitle":"dfjhkjhf", 
     "documentdescription":"dfhjshfjdhsj" 
     } 
} 
] 

In HTML wir ng-Wiederholung zeigen Dokumentenliste verwenden -

<div> 
    //search input textbox 
    <input ng-model="searchDocument" placeholder="Search"> 
</div> 
<div ng-repeat="document in documentList | filter: filteredDocument"> 
    //our html code 
</div> 

In-Controller schreiben wir Filterfunktion zurückzukehren gefiltertes Objekt unter Verwendung von zwei Eigenschaften des Objekts, die "Dokumenttitel" und "Dokumentbeschreibung" sind, ist das Codebeispiel wie folgt:

function filterDocuments(document) 
     { 
      if($scope.searchDocument) 
      { 
        if(document.documentTitle.toLowerCase().indexOf($scope.searchDocument.toLowerCase()) !== -1 || document.document.shortDescription.toLowerCase().indexOf($scope.searchDocument.toLowerCase()) !== -1) 
       { 
        //returns filtered object 
        return document 
       } 
      }else { 
       return document; 
      } 
     } 

Dabei ist $ scope.searchDocument die Bereichsvariable, die an das Such-Textfeld gebunden ist (HTML-Eingabe-Tag), in das der Benutzer den zu suchenden Text eingeben kann.

+0

Ich finde diese Antwort sehr verwirrend. Wie beantwortet es die Frage? –

+0

Sehr geehrter Herr (@Jason Swett), Wenn wir Array von Objekt und das Objekt haben eine andere Objekteigenschaft in ihm zum Beispiel "Dokument" -Eigenschaft von Array-Objekt dann müssen wir benutzerdefinierte Filter im Controller erstellen, um die "Suche" zu implementieren wie Funktionalität. –

2

Wenn Sie mehrere Eigenschaften filtern, ist die Syntax ähnlich wie unten.

<ul> 
    <li ng-repeat="item in list | {filter: top_object_property_name: value, top_object_property_with_nested_objects_name: {nested_object_property_name: value}}"> 
     ... 
    </li> 
</ul> 

zB:

 var employees = [name: 'John', roles: [{roleName: 'Manager'},{roleName: 'Supervisor'}]]; 

     <li ng-repeat="staff in employees | {filter: name: 'John', roles: {roleName: 'Manager'}}"> 
       ... 
     </li>