Angular 2에서 TypeScript로 배열을 어떻게 필터링합니까?
ng-2 부모-자녀 데이터 상속은 저에게 어려움이었습니다.
잘 작동하는 실용적인 솔루션이 될 수있는 것은 내 전체 데이터 배열을 단일 부모 ID로 참조되는 자식 데이터로만 구성된 배열로 필터링하는 것입니다. 즉, 데이터 상속은 하나의 상위 ID에 의한 데이터 필터링이됩니다.
구체적인 예에서 이것은 다음과 같을 수 있습니다 : 특정한 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는 저에게 처음이지만 여기에서 작업을 수행하는 데 거의 가까워졌습니다.
(또한 원래 책 배열을 덮어 쓰는 것도 옵션이 될 수 있습니다 *ngFor="#book of books"
.)
편집 가까워 지지만 여전히 오류가 발생합니다.
//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
코드를 입력 ngOnInit
하고 this
키워드를 사용해야합니다 .
ngOnInit() {
this.booksByStoreID = this.books.filter(
book => book.store_id === this.store.id);
}
You need ngOnInit
because the input store
wouldn't be set into the constructor:
ngOnInit is called right after the directive's data-bound properties have been checked for the first time, and before any of its children have been checked. It is invoked only once when the directive is instantiated.
(https://angular.io/docs/ts/latest/api/core/index/OnInit-interface.html)
In your code, the books filtering is directly defined into the class content...
You can check an example in Plunker over here plunker example filters
filter() {
let storeId = 1;
this.bookFilteredList = this.bookList
.filter((book: Book) => book.storeId === storeId);
this.bookList = this.bookFilteredList;
}
To filter an array irrespective of the property type (i.e. for all property types), we can create a custom filter pipe
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({ name: "filter" })
export class ManualFilterPipe implements PipeTransform {
transform(itemList: any, searchKeyword: string) {
if (!itemList)
return [];
if (!searchKeyword)
return itemList;
let filteredList = [];
if (itemList.length > 0) {
searchKeyword = searchKeyword.toLowerCase();
itemList.forEach(item => {
//Object.values(item) => gives the list of all the property values of the 'item' object
let propValueList = Object.values(item);
for(let i=0;i<propValueList.length;i++)
{
if (propValueList[i]) {
if (propValueList[i].toString().toLowerCase().indexOf(searchKeyword) > -1)
{
filteredList.push(item);
break;
}
}
}
});
}
return filteredList;
}
}
//Usage
//<tr *ngFor="let company of companyList | filter: searchKeyword"></tr>
Don't forget to import the pipe in the app module
We might need to customize the logic to filer with dates.
참고URL : https://stackoverflow.com/questions/37003551/how-do-i-filter-an-array-with-typescript-in-angular-2
'programing' 카테고리의 다른 글
두 개의 슬래시로 시작하는 URI… 어떻게 동작합니까? (0) | 2020.09.03 |
---|---|
Android xml 오류 : RelativeLayout (@ id / LinearLayout_acc, @ id / ProgressBar_statusScreen)과 함께 "주어진 이름과 일치하는 리소스를 찾을 수 없음" (0) | 2020.09.03 |
C #에서 try / catch의 실제 오버 헤드는 무엇입니까? (0) | 2020.09.03 |
어디에서 isset () 및! empty ()를 사용해야합니까? (0) | 2020.09.03 |
C ++에서 함수 이름에 별칭을 어떻게 할당합니까? (0) | 2020.09.03 |