Darin Haener
Joined
10 Experience
0 Lessons Completed
0 Questions Solved
Activity
This is awesome Chris! I noticed that on mobile browsers the scroll handler is called multiple times, resulting in multiple network requests and several duplicate pages being loaded and appended. If anyone else runs into this, adding a simple loading state to the controller can fix this:
export default class extends Controller {
static targets = ['entries', 'pagination'];
initialize() {
this.loading = false;
}
scroll() {
const nextPage = this.paginationTarget.querySelector("a[rel='next']");
if (nextPage == null) return;
const url = nextPage.href;
const body = document.body;
const html = document.documentElement;
const height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
if (window.pageYOffset >= height - window.innerHeight - 500) {
if (this.loading) return;
this.loadMore(url);
}
}
loadMore(url) {
this.loading = true;
Rails.ajax({
type: 'GET',
url,
dataType: 'json',
success: data => {
this.entriesTarget.insertAdjacentHTML('beforeend', data.entries);
this.paginationTarget.innerHTML = data.pagination;
this.loading = false;
}
});
}
}
Just create a global this.loading
variable on initialize and set to true
in the loadMore
method, then set to false
after a successful load and voila!