[javascript] Ember.js로 무한 스크롤 기능을 어떻게 구현하나요?
Ember.js로 무한 스크롤 기능을 어떻게 구현하나요?
브라우저에서 많은 양의 데이터를 효율적으로 처리하기 위해 무한 스크롤(infinite scroll) 기능은 많이 사용됩니다. 이 기능을 Ember.js로 구현하는 방법을 알아보겠습니다.
1. 스크롤 이벤트 감지
우선, 스크롤 이벤트를 감지하여 데이터를 로드하기 위한 작업을 시작해야 합니다. 이를 위해 Ember의 `` 훅을 사용하여 스크롤 이벤트를 등록합니다.
import Component from '@ember/component';
import { action } from '@ember/object';
import $ from 'jquery';
export default class InfiniteScrollComponent extends Component {
@action
didInsert() {
$(window).on('scroll', this.handleScroll);
}
willDestroy() {
$(window).off('scroll', this.handleScroll);
}
@action
handleScroll() {
// 스크롤 위치 계산 및 데이터 로드 작업 수행
}
}
2. 스크롤 위치 계산
스크롤 이벤트 발생 시, 현재 스크롤 위치를 계산하여 언제 데이터를 로드해야 하는지를 판단해야 합니다. 스크롤 위치 계산에는 window.pageYOffset
을 사용할 수 있습니다.
@action
handleScroll() {
const scrollPosition = window.pageYOffset;
const windowHeight = window.innerHeight;
const documentHeight = $(document).height();
if (scrollPosition + windowHeight >= documentHeight) {
// 데이터 로드 작업 수행
}
}
3. 데이터 로드 작업 수행
스크롤 위치가 로딩 임계점에 도달하면 실제 데이터를 로드하는 작업을 수행해야 합니다. 먼저, Ember의 store
서비스를 활용하여 데이터를 가져옵니다.
import { inject as service } from '@ember/service';
export default class InfiniteScrollComponent extends Component {
@service store;
@action
handleScroll() {
// ...
if (scrollPosition + windowHeight >= documentHeight) {
// 데이터 로드 작업 수행
this.loadMoreData();
}
}
async loadMoreData() {
const data = await this.store.query('model', { page: nextPageNumber });
// 데이터 처리 및 렌더링 작업 수행
}
}
위 예제에서 model
은 Ember 데이터 모델의 이름이며, query
메서드를 사용하여 페이지 번호에 따라 데이터를 로드합니다.
4. 데이터 처리 및 렌더링
마지막으로, 로드한 데이터를 적절하게 처리하고 UI에 렌더링해야 합니다. 이 단계에서 추가 데이터를 기존 데이터와 결합하거나, Ember 컴포넌트를 사용하여 새로운 아이템을 동적으로 추가할 수 있습니다.
import { tracked } from '@glimmer/tracking';
export default class InfiniteScrollComponent extends Component {
@tracked items = [];
async loadMoreData() {
// ...
const newData = data.map(item => {
// 데이터 처리 로직 수행
});
// 기존 데이터와 새로운 데이터를 결합
this.items = [...this.items, ...newData];
}
}
위 예제에서 @tracked
를 사용하여 items
배열을 추적하고, loadMoreData
메서드에서 새로운 데이터를 기존 데이터와 합칩니다. 이후 템플릿에서 `` 블록을 사용하여 아이템을 렌더링할 수 있습니다.
이제 이 무한 스크롤 컴포넌트를 사용하여 브라우저에서 많은 양의 데이터를 효율적으로 처리할 수 있습니다.
참고 자료: