2016-04-12 12 views
0

Q) Was ist falsch an meiner Syntax/Code unten?Ionic 2: Pipe zum Filtern der Async-Liste nach Name Eigenschaft

Ich möchte meine Liste von Elementen mit dem Namen Eigenschaft filtern. Ich habe unten mit dem Code versucht, aber ich erhalte die Fehlermeldung:

Kann nicht Eigentum ‚toLowerCase‘ undefinierten

Hinweis lesen: Abfrage ist definiert als eine leere Zeichenfolge auf Seite Last dh

var query = ""; 

Meine Vorlage:

<ion-card *ngFor="#item of (items | clientNameFilter:query)"> 
    <img [src]="getItemImage(item)" (click)="editItem(item)"/> 
    <ion-card-content (click)="editItem(item)"> 
     <h2 class="card-title">{{item.name}}</h2> 
     <p>{{item.address.name}}</p> 
     <p>{{item.address.addressLine1}}</p> 
     <p>{{item.address.town}}</p> 
     <p>{{item.address.postcode}}</p> 
    </ion-card-content> 
    </ion-card> 

Mein Filter:

import {Pipe, PipeTransform} from 'angular2/core'; 
import {Client} from '../interfaces/client'; 

@Pipe({ 
    name: 'clientNameFilter', 
    pure: false 
}) 
export class ClientNameFilterPipe implements PipeTransform { 
    transform(query: string, clients: Client[]) { 
    return clients.filter(client => 
     client.name.toLowerCase().indexOf(query) > -1 
    ); 
    } 
} 
+0

Did y Oder versuchen Sie, 'clients' und' client.name' zu ​​drucken, um zu sehen, wann sie 'null' sind? –

Antwort

1

Die Parameter sind nicht in der richtigen Reihenfolge und der zweite Parameter muss ein Array sein:

@Pipe({ 
    name: 'clientNameFilter' 
}) 
export class ClientNameFilterPipe implements PipeTransform { 
    transform(clients: Client[], params: string[]) { 
    let query = params[0]; 
    return clients.filter(client => 
     client.name.toLowerCase().indexOf(query) > -1 
    ); 
    } 
} 

Der erste Parameter ist der Wert/list man das Rohr innen in und die angewendet werden zweitens deine Parameter.

Sehen Sie dieses Dokument für weitere Informationen:

+0

Sie wieder! Vielen Dank für Ihre Antwort. Es scheint, dass meine Sammlung nicht definiert ist: Eigenschaft 'Filter' von undefined kann nicht gelesen werden. Es ist erwähnenswert, dass die Liste ein http-beobachtbarer Aufruf ist. – Dave

+0

Oh! Sie müssen also die asynchrone Pipe hinzufügen: '' und prüfen, ob der Parameter clients nicht null ist. Wenn das nicht der Fall ist, gebe null direkt zurück ... –

+0

hmmm, das hat dazu geführt, dass die Liste nie angezeigt wurde. Wrapping der Vorlage mit:

....
scheint zu funktionieren. Das scheint ok? – Dave

0

Hier ist meine Arbeitsversion (für Kontakte):

import { PipeTransform, Pipe } from '@angular/core'; 

@Pipe({ 
    name: 'contactNameFilter' 
}) 
export class ContactNameFilterPipe implements PipeTransform { 
    transform(contacts: Array<any>, searchTerm: string) : Array<any> { 
    if (contacts == null) { 
     return []; 
    } 
    if (searchTerm == null) { 
     return contacts; 
    } 
    return contacts.filter(contact => { 
     return `${contact.firstName} ${contact.lastName}`.toLowerCase().indexOf(searchTerm) > -1; 
    }); 
    } 
} 

und Nutzung:

<ion-item *ngFor="let contact of (contacts | async | contactNameFilter:searchTerm)">