Kako filtrirati niz u TypeScriptu u Angularu 2?
Nasljeđivanje podataka između roditelja i djeteta u ng-2 bilo mi je teško.
Čini se da bi dobar praktičan radni pristup mogao biti filtriranje mog cjelokupnog niza podataka u niz koji se sastoji samo od podataka djece referenciranih jednim ID-om roditelja. Drugim riječima: nasljeđivanje podataka postaje filtriranje podataka prema jednom ID-u roditelja.
U konkretnom primjeru ovo može izgledati ovako: filtriranje niza knjiga kako bi se prikazale samo knjige s određenim store_id.
import {Component, Input} from 'angular2/core';
export class Store {
id: number;
name: string;
}
export class Book {
id: number;
shop_id: number;
title: string;
}
@Component({
selector: 'book',
template:`
<p>These books should have a label of the shop: {{shop.id}}:</p>
<p *ngFor="#book of booksByShopID">{{book.title}}</p>
`
])
export class BookComponent {
@Input()
store: Store;
public books = BOOKS;
// "Error: books is not defined"
// ( also doesn't work when books.filter is called like: this.books.filter
// "Error: Cannot read property 'filter' of undefined" )
var booksByStoreID = books.filter(book => book.store_id === this.store.id)
}
var BOOKS: Book[] = [
{ 'id': 1, 'store_id': 1, 'name': 'Dichtertje' },
{ 'id': 2, 'store_id': 1, 'name': 'De uitvreter' },
{ 'id': 3, 'store_id': 2, 'name': 'Titaantjes' }
];
TypeScript mi je nov, ali mislim da sam blizu da ovdje stvari prorade.
(Također, prepisivanje izvornog niza knjiga moglo bi biti opcija, a zatim korištenje *ngFor="#book of books".)
UREDI Približavamo se, ali još uvijek daje pogrešku.
//changes on top:
import {Component, Input, OnInit} from 'angular2/core';
// ..omitted
//changed component:
export class BookComponent implements OnInit {
@Input()
store: Store;
public books = BOOKS;
// adding the data in a constructor needed for ngInit
// "EXCEPTION: No provider for Array!"
constructor(
booksByStoreID: Book[];
) {}
ngOnInit() {
this.booksByStoreID = this.books.filter(
book => book.store_id === this.store.id);
}
}
// ..omitted
Odgovor #1
Trebate staviti svoj kod u ngOnInit i koristiti ključnu riječ this:
ngOnInit() {
this.booksByStoreID = this.books.filter(
book => book.store_id === this.store.id);
}
Trebate ngOnInit jer unos store ne bi bio postavljen u konstruktor:
ngOnInit se poziva odmah nakon što su svojstva direktive vezana za podatke prvi put provjerena, i prije nego što su provjerena bilo koja od njezine djece. Poziva se samo jednom kada se direktiva instancira.
(https://angular.io/docs/ts/latest/api/core/index/OnInit-interface.html)
U vašem kodu filtriranje knjiga je izravno definirano unutar sadržaja klase...
Odgovor #2
Primjer možete provjeriti u Plunkeru ovdje plunker primjer filtera
filter() {
let storeId = 1;
this.bookFilteredList = this.bookList
.filter((book: Book) => book.storeId === storeId);
this.bookList = this.bookFilteredList;
}
