#angular #typescript #rxjs #paginator #mat-pagination
Вопрос:
Я пытался реализовать разбиение на страницы на стороне сервера с помощью mat-пагинатора и столкнулся с множеством трудностей. Я проверил различные блоги и учебные пособия, но ни один из них не помог мне достичь моей цели.
Обслуживание-
getAllCategoryByPage(data?: any): Observable<any> {
var Url = `/Categories/GetAll`;
return this.http
.post<any>(Url, data)
.pipe(catchError(this.handleError<any>('getAllCategoryByPage', [])));
}
Компоненты .ts-
@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort; //sorting is not mandatory in my case
ngOnInit(): void {
this.loadCategoryList;
this.dataSource.paginator = this.paginator;
}
ngAfterViewInit() {
this.loadCategoryList();
this.dataSource.paginator = this.paginator;
}
loadCategoryList = (): void => {
this.paginator.page.subscribe((resp) => {console.log(resp);});
merge(this.paginator.page)
.pipe(
startWith({}),
switchMap(() => {
this.asyncService.start();
console.log(this.paginator.pageIndex ,this.paginator.pageSize);
return this.categoryService.getAllCategoryByPage(
{
"page": this.paginator.pageIndex 1,
"pageSize": this.paginator.pageSize,
"searchString": ""
}
)
})
)
.subscribe(
data => {
console.log(data.apiData);
this.length = data.totalRecord;
this.dataSource.paginator = data.apiData;
this.asyncService.finish();
}
);
};
HTML-
<table mat-table [dataSource]="dataSource">
<ng-container matColumnDef="sl">
<th mat-header-cell *matHeaderCellDef> SL. </th>
<td mat-cell *matCellDef="let element; let i = index;"> {{i 1}} </td>
</ng-container>
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef >CATEGORY NAME </th>
<td mat-cell *matCellDef="let element"> {{element.categoryName}} </td>
</ng-container>
<ng-container matColumnDef="status">
<th mat-header-cell *matHeaderCellDef >STATUS </th>
<td mat-cell *matCellDef="let element">
{{element.recStatus}}
</td>
</ng-container>
<ng-container matColumnDef="actions">
<th mat-header-cell *matHeaderCellDef>ACTIONS</th>
<td mat-cell *matCellDef="let row" >
<button class="table-button-action" style="color: red;" (click)="deleteRow(row)" >
<mat-icon>clear</mat-icon>
</button>
<button class="table-button-action" style="color:royalblue;" (click)="onEdit(row)">
<mat-icon>create</mat-icon>
</button>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
<mat-paginator [length]= "length" [pageSizeOptions]="[5, 10, 25, 100]">
</mat-paginator>
Я не получаю данные в таблице. Здесь я получаю ошибку при загрузке страницы, а также при навигации по страницам (с помощью кнопок «Следующий» и «предыдущий»), о которой я понятия не имею, в чем заключается ошибка и как ее решить
Может ли кто-нибудь, пожалуйста, помочь мне исправить это, чтобы оно работало идеально?
Заранее спасибо 🙂
Комментарии:
1. Это неправильное использование полужирного шрифта… кроме того, это скорее сбивает с толку, чем помогает
2. Я подозреваю, что проблема в
merge()
том, что вы вызываете его,ngOnInit
когдаpaginator
он не имеет значения… вы должны добавить проверку перед этим, чтобы увидетьpaginator
, действительно ли она имеет значение3. @MrCodingB Не могли бы вы подробнее рассказать, как это сделать? Я ничего не понимаю…
4. Прежде чем звонить
merge()
, вы должны разместить заявление if, подобное этомуif (!this.paginator) { return; }
. Поэтому, если пагинатор не установлен, он не сливается5. Не могли бы вы, пожалуйста, включить
this.categoryService.getAllCategoryByPage
сюда содержание функции?
Ответ №1:
Похоже , что служебная функция getAllCategoryByPage
не возвращает правильное Observable
значение , и я ожидаю, что это произойдет из-за catchError
неправильной работы (вы передали функцию непосредственно в нее, не возвращая наблюдаемое).
Поэтому не могли бы вы, пожалуйста, попробовать следующее:
getAllCategoryByPage(data?: any): Observable<any> {
var Url = `/Categories/GetAll`;
return this.http.post<any>(Url, data).pipe(
catchError(() => {
this.handleError<any>('getAllCategoryByPage', []);
return EMPTY;
})
);
}
Комментарии:
1. По-прежнему отображается та же ошибка 🙁 Также данные не загружены в таблицу…
2. Не могли бы вы, пожалуйста, поставить его на место?
Ответ №2:
В вашем subscribe
обработчике у вас есть это:
this.dataSource.paginator = data.apiData;
Вместо этого вам следует присвоить данные this.dataSource.data
свойству.
Попробуйте это:
this.dataSource.data = data.apiData;
Комментарии:
1. Раньше так и было
this.dataSource.data = data.apiData;
, но в этом случае кнопки навигации работали неправильно. Итак, я превратил его вthis.dataSource.paginator = data.apiData;
2. Вам следует внимательнее ознакомиться с примерами в документации . Вы можете заметить, что данные необходимо назначить DataSource.data, или вы также можете сделать это с помощью метода DataSource.setData.