Вот как мы это делаем, используя Angular 5 и WebApi в качестве серверной части.Мы реализовали некоторую сортировку в наших таблицах, но вы можете использовать только часть с прокруткой и использовать ее в своем списке.Также мы берем все данные из таблиц и затем отправляем их клиентам по 10 штук, но если вам нужна скорость, вы можете пейджировать свои данные на SQL-сервере и занимать всего 10 строк за раз.Если вам нужна логика для такого рода пейджинга, просто дайте мне знать.
HTML
<div #scb id="scb" class="scrollBarClass" *ngIf="sales && sales.length" (scroll)="onScroll()">
<div class="table table-striped table-responsive table-sm table-bordered">
<table class="table" *ngIf="sales && sales.length">
// here goes you table structure, headers, body and so...
</table>
</div>
</div>
CSS
.scrollBarClass {
max-height: 500px;
overflow-y: scroll;
}
Угловой компонент
import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';
@ViewChild('scb') grid: ElementRef;
scroll = false;
page = 1;
total = 0;
onScroll() {
if (this.grid.nativeElement.scrollHeight - this.grid.nativeElement.scrollTop < 510 && this.scroll == false) {
if (this.sales.length == this.total) {
return;
}
let p: any;
this.page++;
this.scroll = true;
this._myService.searchSales(this.page, 10, this.sortType, this.sortAD)
.subscribe(
(data) => { p = data['data']; this.total = data['count']},
error => { this.errorMessage = <any>error; this.page--; },
() => {
this.scroll = false;
Array.prototype.push.apply(this.sales, p);
});
}
}
Угловой сервис
searchSales(page: number, recperpage: number, sorttype: string, sortad: string) {
let params = new HttpParams()
.append('page', page.toString())
.append('recperpage', recperpage.toString())
.append('sorttype', sorttype)
.append('sortad', sortad);
return this._http.get<any[]>('sales/searchsales', { params: params });
}
Контроллер WebAPI
[HttpGet]
public IHttpActionResult searchsales(int page, int recperpage, string sorttype, string sortad)
{
try
{
var count = 0;
var r = _salesService.SearchSales(sorttype, sortad, ref count);
return Ok(new { data=r.Skip((page - 1) * recperpage).Take(recperpage).ToList(), count });
}
catch (Exception e)
{
return InternalServerError(e);
}
}
Сервис WebAPI
public List<Sales> SearchSales(string sorttype, string sortad, ref int count)
{
var query = "";
query = " select * FROM Sales "+
" ORDER BY " + ((sorttype == null) ? "DateOfSale" : sorttype) + " " + ((sortad == null) ? "DESC" : sortad);
var result = SQLHelper.ExecuteReader(query);
count = result.Count;
return result;
}