반응형
State :
UI State | spinner의 작동 시기 및 Loading 데이터. |
Temporary / Local State | Service의 List와 같은 데이터. |
Persistent State | Storage 혹은 Database와 같은 자료 |
RxJS의 Subject를 이용한 UI State 관리
Http로 데이터를 로딩하는 동안 Spinner를 작동하는 예제로 설명하겠습니다.
Http - Async Data를 로딩 합니다. (delay를 사용했습니다.)
최신의 데이터를 받아서 UI의 랜더링을 할 수 있도록 State를 관리합니다.
//service.ts
import { BehaviorSubject } from 'rxjs';
// BehaviorSubject<제네릭>(초기값)으로 Subject로 객체를 주입합니다.
private _places = new BehaviorSubject<Place[]> ([
new Place(), new Place()
]);
// Observable로 리스트를 보냅니다. 가장 최신의 async값을 보내기 위함입니다.
get places() {
return this._places.asObservable();
}
import { take, tap, delay } from 'rxjs/operators';
/* Observable을 반환 하는 take, delay, tap operator입니다.
tap:
탭은 3가지의 경우에 쓰일 수 있습니다.
nextOrObserver: Observable이 실행 될 경우.
error: 에러가 발생한 경우.
complete: 완료된 경우.
*/
addPlace() {
const newPlace = new Place(); //Place를 생성하는 값들을 제거한 버전입니다.
// pipe operator들을 연속해서 사용할 수 있도록 합니다.
return this.places.pipe(
//가장 최근의 값만 가져와 처리합니다.
take(1),
//Http의 로딩을 해야하지만, 코드가 길어지므로 대체. 시간을 1초로 합니다.
delay(1000),
//해당 매쏘드에서 consume하지 않고 return합니다.
tap(places => {
// BehaviorSubject.next() 실행할 작업을 기입합니다.
this._places.next(places.concat(newPlace)); // 해당 리스트에 newPlace를 추가합니다.
})
);
}
// page.ts
isLoading = false;
import { LoadingController } from '@ionic/angular';
// 로딩시 spinner를 작동할 수 있도록 LoadingContorller 사용.
constructor(private loadingCtrl: LoadingController) {}
onCreateOffer() {
this.loadingCtrl
.create({
message: 'Creating place...' // 스피너와 함께 나올 문구
})
.then(loadingEl => {
loadingEl.present(); // 스피너를 UI에 표시.
this.placesService
// 위에서 구현한 매쏘드
.addPlace()
// next()를 구독(subscribe)
.subscribe(() => {
loadingEl.dismiss(); // UI에서 스피너 제거.
});
});
}
번외.
ionic의 lifeCycle을 관리해주어야 합니다.
ngOnInit() 의 경우 angular가 관리를 해주지만, Subject는 사용자가
ngOnDestroy()를 해주어야 합니다.
//page.ts
import { Subscription } from 'rxjs';
// Subscription을 주입합니다.
private placeSub: Subscription;
매쏘드() {
this.placeSub = this.placesService
.addPlace()
.subscribe(
... // 여러 작업 수행
});
});
}
ngOnDestroy() {
if (this.placeSub) {
this.placeSub.unsubscribe();
}
}
반응형
'프로그래밍 > Ionic' 카테고리의 다른 글
Ionic 4 searchbar 자동완성 (0) | 2019.10.24 |
---|---|
DataHandling (0) | 2019.10.18 |
Styling & Theming (0) | 2019.10.12 |
유용한 컴포넌트 소개 (0) | 2019.10.12 |
캐패시터로 네이티브 앱 만들기 (0) | 2019.09.25 |