2015-12-22 29 views
19

Sto cercando come filtrare una matrice di dati in Angular2.Filtraggio di una matrice angolare2

Ho esaminato l'utilizzo di un tubo personalizzato, ma ritengo che questo non sia quello che sto cercando, poiché sembra più orientato verso trasformazioni di presentazione semplici piuttosto che filtrare grandi serie di dati.

La matrice è impostato come segue:

getLogs(): Array<Logs> { 
     return [ 
      { id: '1', plate: 'plate1', time: 20 }, 
      { id: '1', plate: 'plate2', time: 30 }, 
      { id: '1', plate: 'plate3', time: 30 }, 
      { id: '2', plate: 'plate4', time: 30 }, 
      { id: '2', plate: 'plate5', time: 30 }, 
      { id: '2', plate: 'plate6', time: 30 } 
     ]; 
    } 

voglio filtrare questo id. Quindi quando inserisco "1" in una barra di ricerca, si aggiorna per visualizzare i valori corrispondenti.

Se c'è un metodo su come farlo, mi piacerebbe saperlo!

risposta

32

Non c'è modo di farlo con un tubo di default. Ecco l'elenco delle pipe supportate per impostazione predefinita: https://github.com/angular/angular/blob/master/modules/angular2/src/common/pipes/common_pipes.ts.

Detto questo si può facilmente aggiungere una tubazione per tale caso d'uso:

import {Injectable, Pipe} from 'angular2/core'; 

@Pipe({ 
    name: 'myfilter' 
}) 
@Injectable() 
export class MyFilterPipe implements PipeTransform { 
    transform(items: any[], args: any[]): any { 
     return items.filter(item => item.id.indexOf(args[0]) !== -1); 
    } 
} 

e usarlo:

import { MyFilterPipe } from './filter-pipe'; 
(...) 

@Component({ 
    selector: 'my-component', 
    pipes: [ MyFilterPipe ], 
    template: ` 
    <ul> 
     <li *ngFor="#element of (elements | myfilter:'123')">(...)</li> 
    </ul> 
    ` 
}) 

Spero che ti aiuta, Thierry

+0

cosa fa l'implementazione di PipeTransform? Sono un po 'confuso riguardo al suo scopo. – Witted

+0

In effetti, quando si desidera implementare una pipe, è necessario implementare questa interfaccia e inserire l'elaborazione nel metodo 'transform'. Vedere la documentazione corrispondente per maggiori dettagli: https://angular.io/docs/ts/latest/api/core/PipeTransform-interface.html. Il suo primo parametro corrisponde alla lista stessa e il secondo agli elementi da usare per filtrare l'elenco ... –

+0

Grazie per la spiegazione.Ultima domanda è possibile rendere l'output da * ngFor = "# elemento di (elementi | myfilter: '123') una variabile? – Witted

5

Ho uno scenario simile in uno dei miei campioni

<input "(keyup)="navigate($event)" /> 

<div *ngFor="#row of visibleRows"></div>  

...... 

navigate($event){ 
     this.model.navigate($event.keyCode); 
     this.visibleRows = this.getVisibleRows(); 
} 

getVisibleRows(){ 
    return this.model.rows.filter((row) => row.rowIndex >= this.model.start && row.rowIndex < this.model.end); 
} 

Il mio approccio è quello di ricalcolare la matrice su qualche evento di qualificazione. Nel mio caso è la chiave. Potrebbe sembrare conveniente associare una funzione o un filtro, ma è preferibile collegarsi direttamente alla matrice. Questo perché il rilevamento delle modifiche verrà confuso poiché la funzione/filtro restituirà una nuova istanza di array ogni volta che viene attivato il rilevamento delle modifiche, indipendentemente da ciò che lo ha attivato.

Qui è la sorgente completo: https://github.com/thelgevold/angular-2-samples/tree/master/components/spreadsheet

ho anche una demo: http://www.syntaxsuccess.com/angular-2-samples/#/demo/spreadsheet

+0

Ive ha effettivamente trovato la tua github molto utile già così grazie! Il mio tavolo in quello che sto lavorando si basa molto sulla tua griglia usando: per costruire l'array in una tabella. è stato un grande aiuto in un linguaggio nuovo e scarsamente documentato. Questo in realtà non ha molta rilevanza per la domanda, ma più un ringraziamento personale. – Witted

+0

Grazie! Sono lieto che trovi utili gli esempi – TGH

+0

"il rilevamento delle modifiche verrà confuso poiché la funzione/filtro restituirà una nuova istanza dell'array ogni volta che viene attivato il rilevamento delle modifiche" - molto vero, ma è possibile restituire la stessa istanza dell'array ogni volta se usi una pipe stateful. Oppure, se il tuo componente lo consente, puoi utilizzare la strategia di rilevamento delle modifiche "onPush" insieme a una pipe stateful. Discuto entrambe le opzioni in [questa risposta SO] (http://stackoverflow.com/a/34497504/215945). –

Problemi correlati