반응형
아이오닉(앵귤러)로 Array데이터를 필터링 하는 방법입니다.
기존방식: DOM을 직접 수정. Class나 style를 추가하여 DOM에 값을 추가하는 방식이었습니다.
jQuery 및 elemnt에 직접 접근하여 Class 추가 및 제거, style의 display값을 변경합니다.
기존의 방식처럼 element에 속성 값을 추가하려고 하면 에러가 발생합니다.
렌더링 할 때 제어할 수 없는 값이 추가되어 있기 때문입니다.
그렇다면 어떻게 해야할까요?
프로그래시브 프레임워크에서는 Array data를 직접 서버사이드 렌더링 처럼 처리합니다.
1. 데이터 javascript로 배열 데이터 필터
2. HTML 렌더링
<!-- HTML -->
<ion-header>
<ion-toolbar>
<ion-title>숫자 필터</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-item>
<ion-button color="success" fill="solid" slot="end" (click)="filterArray($event.target, 1)" clickable>짝수</ion-button>
<ion-button color="medium" fill="solid" slot="end" (click)="filterArray($event.target, 0)" clickable>홀수</ion-button>
</ion-item>
<ion-list>
<ion-card >
<ion-card-header color="primary">
<ion-label>위에 필터를 눌러보세요.</ion-label>
</ion-card-header>
<ion-item *ngFor="let number of filteredArray; let idx = index;">
<ion-grid>
<ion-row>
<ion-col size-sm="2">
<ion-label position="floating">{{number}}</ion-label>
</ion-col>
</ion-row>
</ion-grid>
</ion-item>
</ion-card>
</ion-list>
</ion-content>
// angular
import { Component, OnInit } from '@angular/core';
filteredArray: number[] = [...this.array];
private _array: number[] = [1,2,3,4,5,6];
private _filter: number[] = [];
constructor() {}
filterArray(element: HTMLElement, reminder: number) {
this._addToFilter(reminder);
if(this._filter.length > 0) {
this._filter.forEach(_reminder => this._filterByReminder(_reminder))
}
this._toggleButtonOutline(element);
}
private _filterByReminder(reminder: number) {
this.filteredArray = this.filteredArray.filter(number => number % 2 == reminder);
}
private _addToFilter(reminder) {
if(this._filter_has(reminder)) {
this._resetArray();
this._filter_pop(reminder);
} else {
this._filter.push(reminder);
}
}
private _filter_has(reminder: number): boolean {
return this.filter.indexOf(reminder)>-1;
}
private _resetArray() {
this.filteredArray = [...this._array]
}
private _filter_pop(target: number) {
this._filter = this._filter.filter(num => num != target);
}
private _toggleButtonOutline(button: HTMLElement) {
button['fill'] = button['fill'] == "outline" ? "solid" : "outline";
}
필터 버튼 보이는 것 때문에 매쏘드에서 reminder의 개념이 헤깔리네요...
반응형
'프로그래밍 > Angular' 카테고리의 다른 글
Pipe 재사용 및 Shared Module 사용법 (0) | 2021.07.09 |
---|---|
Service VS EventEmitter (0) | 2020.02.19 |
Dynamic Component (0) | 2019.09.13 |
Authentication & Route Protection (0) | 2019.09.06 |
Http (0) | 2019.08.20 |