ng2-infinity-grid
v0.0.13
Published
An implementation of infinity grid at Angular2 [4.x compatible].
Downloads
3
Maintainers
Readme
ng2-infinity-grid
An implementation of infinity grid at Angular2 [4.x compatible].
Demo
Description
The solution based on virtual scroll technique and use most large possible height value of html element.
Installation
First you need to install the npm module:
npm install ng2-infinity-grid --save
Usage
<button type="button" (click)="loadData()">Load</button>
<button type="button" (click)="clearData()">Clear</button>
...
<InfinityGrid [pageData]="pageData"
[preventLoadPageAfterViewInit]="true"
(fetchPage)="onFetchPage($event)">
</InfinityGrid>
import {
InfinityPage,
InfinityPageData,
} from "ng2-infinity-grid/index";
@Component({...})
export class HomeComponent {
private dataProvider: DataProvider;
private pageData: InfinityPageData<string>;
constructor() {
this.dataProvider = new DataProvider(); // Inject your data provider here
}
private clearData() {
// Case #1 - initial state
// Flux action should be started here. Local pageData object should be updated during Flux-lifecycle
this.pageData = null;
}
private loadData() {
// Case #2
// Flux action should be started here. Local pageData object should be updated during Flux-lifecycle
this.pageData = {};
}
private onFetchPage(page: InfinityPage) {
// Case #3
// Flux action should be started here. Local pageData object should be updated during Flux-lifecycle
// When long asynchronous request has been started so we should show loading rows in grid
this.pageData = {
startIndex: page.startIndex,
endIndex: page.endIndex
};
if (!page.isReady) {
this.dataProvider.fetch(page)
.then((pageData: InfinityPageData<string>) => {
if (pageData.startIndex === this.pageData.startIndex) {
// Case #4
// The promise is not cancellable [https://github.com/tc39/proposal-cancelable-promises]
// We should check the current index
this.pageData = pageData;
}
});
}
}
}
class DataProvider {
private buffer: string[] = [];
constructor() {
for (let i = 0; i < 1000000; i++) {
this.buffer[i] = 'test-' + i;
}
}
public fetch(page: InfinityPage): Promise<InfinityPageData<string>> {
return new Promise<InfinityPageData<string>>((resolve) => {
setTimeout(() => {
resolve({
startIndex: page.startIndex,
rawData: this.buffer.slice(page.startIndex, page.endIndex + 1),
totalLength: this.buffer.length
});
}, 1000);
});
}
}
Publish
npm run deploy
License
Licensed under MIT.