2016-01-12 5 views
6

Ho il codice seguente e funziona bene, ciò che fa è ngPer ripetere per creare una colonna per ogni colonna nell'oggetto colonna.Come posso mostrare solo i risultati in cui card.column valore corrisponde a column.id in angular2

Attualmente mostra ogni carta dall'oggetto delle carte in ogni colonna.

quello che voglio fare è presentarsi solo carte nella colonna in cui column.id = card.column

Come posso modificare il mio codice per fare questo?

import {Input, Output, EventEmitter, Component, Injectable} from 'angular2/core' 
    import {NgFor} from 'angular2/common' 
    import {Observable} from 'rxjs/Observable'; 

    interface Card { 
    id?: number; 
    title?: string; 
    column?: number; 
    } 

    @Injectable() 
    export class DataService { 
    cards$: Observable<Array<Card>>; 
    private _cardsObserver: any; 
    private _dataStore: Array<Card>; 

    constructor(){ 
     this._dataStore = [ 
     {id: 1, title: 'Card A', column: 1}, 
     {id: 2, title: 'Card B', column: 2}, 
     {id: 3, title: 'Card C', column: 2} 
     ]; 

     this.cards$ = new Observable(observer => 
     this._cardsObserver = observer).share(); 
    } 

    loadCards() { 
     this._cardsObserver.next(this._dataStore); 
    } 

    addCard(){ 
     this._dataStore.push({id: 4, title: 'Card D', column: 3}); 
     this._cardsObserver.next(this._dataStore); 
    } 

    getColumns(){ 

     var columns = [ 
     {id: 1, title: 'Column One'}, 
     {id: 2, title: 'Column Two'}, 
     {id: 3, title: 'Column Three'} 
     ]; 

     return columns; 

    } 

    } 


    @Component({ 
    selector: 'app', 
    providers: [DataService], 
    directives: [], 
    template: ` 
    <button (click)="dataService.addCard()">Add Card</button> 
    <div class="columns" *ngFor="#c of columns"> 
     {{c.title}} 
     <div class="card" *ngFor="#card of cards">{{card.title}}</div> 
    </div> 
    ` 
    }) 
    export class App { 

    private cards: Array<Card>; 
    private columns: any; 

    constructor(public dataService: DataService) { 
     dataService.cards$.subscribe(updatedCards => this.cards = updatedCards); 
     dataService.loadCards(); 
     this.columns = dataService.getColumns(); 

    } 
    } 
+0

product.column? intendevi carta? E 'questo quello che stai cercando? : https://angular.io/docs/js/latest/api/common/NgIf-directive.html – Langley

+0

giusto, card.column. –

+1

senza modificare troppo il tuo esempio puoi aggiungere qualcosa come '* ngIf =" card.colum == column.id "' o usare una pipe per filtrarli nel ngFor https://angular.io/docs/ts/latest /api/common/SlicePipe-class.html ma potresti voler riformattare la struttura dei dati per farlo in un modo più performante in modo da non doverli iterare tutti per ogni colonna – Langley

risposta

5

Come @Langley detto nel suo commento, vorrei creare un tubo personalizzato per questo:

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

@Pipe({ 
    name: 'filter' 
}) 
@Injectable() 
export class CardFilterPipe implements PipeTransform { 
    transform(items: any[], args: any[]): any { 
    return items.filter(item => item.column === args[0]); 
    } 
} 

e utilizzarlo così:

<div class="columns" *ngFor="#c of columns"> 
    {{c.title}} 
    <div class="card" *ngFor="#card of cards | filter:c">{{card.title}}</div> 
</div> 

Se si vuole prendere in aggiornamento dell'account, è necessario impostare l'attributo puro su falso:

@Pipe({ 
    name: 'filter', 
    pure: false 
}) 
@Injectable() 
export class CardFilterPipe implements PipeTransform { 
    (...) 
} 

Spero che ti aiuti, Thierry

+0

Ciao Thierry, questa soluzione produce un errore: ECCEZIONE: Expression 'cards | filtro: c in App @ 4: 29 'è cambiato dopo che è stato controllato. Valore precedente: ''. Valore attuale: '' in [schede | filtro: c in App @ 4: 29] –

+0

Penso che sia necessario abilitare la modalità di produzione per non avere questo messaggio. Basta aggiungere questa riga subito prima di avviare l'applicazione: 'import {enableProdMode} da 'angular2/core'; enableProdMode(); '. Vedere questa risposta per i dettagli sulla modalità di produzione: http://stackoverflow.com/questions/34868810/what-is-diff-between-production-and-development-mode-in-angular2. Spero che ti aiuti. –

+1

@ThierryTemplier, ci sono (migliori) alternative all'utilizzo della modalità di produzione a causa di questo "problema" con pipe stateful in modalità dev: consultare http://stackoverflow.com/a/34497504/215945. Nella modalità di produzione, perdiamo quel prezioso secondo ciclo di rilevamento delle modifiche che otteniamo in modalità dev, che potrebbe rivelare problemi con il nostro codice. (Tuttavia, in questo caso, l'errore lanciato è piuttosto fasullo/fuorviante, come spiegato in quel collegamento.) –

Problemi correlati