Skip to content

Instantly share code, notes, and snippets.

@tinusn
Created September 23, 2015 07:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tinusn/41d4597e6d6b0ef312c4 to your computer and use it in GitHub Desktop.
Save tinusn/41d4597e6d6b0ef312c4 to your computer and use it in GitHub Desktop.
Virtual Repeat Model for angular-materials Virtual Repeat
class VirtualRepeatModel {
PAGE_SIZE: number = 20;
totalItems: number = 0;
totalPages: number;
loadedItems = {};
currentIndex: number;
extraParams = {};
constructor(public api: restangular.IElement, public initialPage?: number) {
}
refresh() {
this.loadedItems = {};
this.getItemAtIndex(0);
}
getItemAtIndex(index: number) {
if (this.initialPage > 1) {
index = index + this.initialPage * this.PAGE_SIZE;
}
this.currentIndex = index;
var pageNumber = Math.floor(index / this.PAGE_SIZE);
var page = this.loadedItems[pageNumber];
if (page) {
return page[index % this.PAGE_SIZE];
} else if (page !== null) {
this.fetchPage(pageNumber);
}
}
fetchPage(pageNumber: number) {
this.loadedItems[pageNumber] = null;
let request = {
page: pageNumber === 0 ? 1 : pageNumber,
pageSize: this.PAGE_SIZE
};
angular.extend(request, this.extraParams);
return this.api.getList(request).then((data) => {
this.totalItems = data.meta.totalRecords;
this.totalPages = data.meta.totalPages;
this.loadedItems[pageNumber] = data.plain();
}).catch((err) => {
return null;
});
}
getLength(): number {
return this.totalItems;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment