私はangularが初めてで、アプリにページネーションを実装しようとしています。 この材料コンポーネント を使用しようとしています
以下のコードを使用すると、.ts
ファイルでlength
、pagesize
、およびpageSizeOptions
を取得できます
<md-paginator [length]="length"
[pageSize]="pageSize"
[pageSizeOptions]="pageSizeOptions"
</md-paginator>
export class PaginatorConfigurableExample {
length = 100;
pageSize = 10;
pageSizeOptions = [5, 10, 25, 100];
}
}
しかし、ページが変更されたときに上記のテーブルのデータを変更する関数をトリガーすることはできません。また、nextPage
、previousPage
、hasNextPage
、およびhasPreviousPage
メソッドを使用するにはどうすればよいですか?
ここでも同じことに苦労しています。しかし、私はいくつかの研究を行っていることをお見せできます。基本的に、最初にfoo.template.tsでページ@Outputイベントの追加を開始します。
<md-paginator #paginator
[length]="length"
[pageIndex]="pageIndex"
[pageSize]="pageSize"
[pageSizeOptions]="[5, 10, 25, 100]"
(page)="pageEvent = getServerData($event)"
>
</md-paginator>
後で、ページネータの要件を処理するために、foo.component.tsクラスおよびその他にpageEvent属性を追加する必要があります。
pageEvent: PageEvent;
datasource: null;
pageIndex:number;
pageSize:number;
length:number;
そして、サーバーデータを取得するメソッドを追加します。
ngOnInit() {
getServerData(null) ...
}
public getServerData(event?:PageEvent){
this.fooService.getdata(event).subscribe(
response =>{
if(response.error) {
// handle error
} else {
this.datasource = response.data;
this.pageIndex = response.pageIndex;
this.pageSize = response.pageSize;
this.length = response.length;
}
},
error =>{
// handle error
}
);
return event;
}
したがって、基本的にページネーターをクリックするたびに、foo.service.ts必要なすべてのデータの取得を呼び出すgetServerData(..)メソッドをアクティブにします。この場合、ビューのレンダリング時に自動的に計算されるため、nextPageおよびnextXXXイベントを処理する必要はありません。
これがあなたのお役に立てば幸いです。成功したかどうか教えてください。 =]
ねえ、私はこれにつまずいてそれを機能させました、ここに方法があります:
私の内部component.html
<mat-paginator #paginator [pageSize]="pageSize" [pageSizeOptions]="[5, 10, 20]" [showFirstLastButtons]="true" [length]="totalSize"
[pageIndex]="currentPage" (page)="pageEvent = handlePage($event)">
</mat-paginator>
私の内部component.ts
public array: any;
public displayedColumns = ['', '', '', '', ''];
public dataSource: any;
public pageSize = 10;
public currentPage = 0;
public totalSize = 0;
@ViewChild(MatPaginator) paginator: MatPaginator;
constructor(private app: AppService) { }
ngOnInit() {
this.getArray();
}
public handlePage(e: any) {
this.currentPage = e.pageIndex;
this.pageSize = e.pageSize;
this.iterator();
}
private getArray() {
this.app.getDeliveries()
.subscribe((response) => {
this.dataSource = new MatTableDataSource<Element>(response);
this.dataSource.paginator = this.paginator;
this.array = response;
this.totalSize = this.array.length;
this.iterator();
});
}
private iterator() {
const end = (this.currentPage + 1) * this.pageSize;
const start = this.currentPage * this.pageSize;
const part = this.array.slice(start, end);
this.dataSource = part;
}
すべてのページング作業は、iterator
メソッド内から行われます。このメソッドは、skip
とtake
を計算し、それをMaterialテーブルのdataSource
に割り当てます。
スライスパイプを使用してAngular Paginatorをデータテーブルにリンクする別の方法。ここで、データはサーバーから1回だけフェッチされます。
表示:
<div class="col-md-3" *ngFor="let productObj of productListData |
slice: lowValue : highValue">
//actual data dispaly
</div>
<mat-paginator [length]="productListData.length" [pageSize]="pageSize"
(page)="pageEvent = getPaginatorData($event)">
</mat-paginator>
コンポーネント
pageIndex:number = 0;
pageSize:number = 50;
lowValue:number = 0;
highValue:number = 50;
getPaginatorData(event){
console.log(event);
if(event.pageIndex === this.pageIndex + 1){
this.lowValue = this.lowValue + this.pageSize;
this.highValue = this.highValue + this.pageSize;
}
else if(event.pageIndex === this.pageIndex - 1){
this.lowValue = this.lowValue - this.pageSize;
this.highValue = this.highValue - this.pageSize;
}
this.pageIndex = event.pageIndex;
}
成分:
import { Component, AfterViewInit, ViewChild } from @angular/core;
import { MatPaginator } from @angular/material;
export class ClassName implements AfterViewInit {
@ViewChild(MatPaginator) paginator: MatPaginator;
length = 1000;
pageSize = 10;
pageSizeOptions: number[] = [5, 10, 25, 100];
ngAfterViewInit() {
this.paginator.page.subscribe(
(event) => console.log(event)
);
}
HTML
<mat-paginator
[length]="length"
[pageSize]="pageSize"
[pageSizeOptions]="pageSizeOptions"
[showFirstLastButtons]="true">
</mat-paginator>
この問題は数時間を費やして解決し、動作するようになりました。これは、angularマテリアルのページネーションを解決する最も簡単な方法であると考えられています。 -最初に(component.html)ファイルで作業を開始します
<mat-paginator [pageSizeOptions]="[2, 5, 10, 15, 20]" showFirstLastButtons>
</mat-paginator>
(component.ts)ファイルで行う
import { MatPaginator } from '@angular/material/paginator';
import { Component, OnInit, ViewChild } from '@angular/core';
export interface UserData {
full_name: string;
email: string;
mob_number: string;
}
export class UserManagementComponent implements OnInit{
dataSource : MatTableDataSource<UserData>;
@ViewChild(MatPaginator) paginator: MatPaginator;
constructor(){
this.userList();
}
ngOnInit() { }
public userList() {
this._userManagementService.userListing().subscribe(
response => {
console.log(response['results']);
this.dataSource = new MatTableDataSource<UserData>(response['results']);
this.dataSource.paginator = this.paginator;
console.log(this.dataSource);
},
error => {});
}
}
覚えておく現在作業中のmodule(module.ts)ファイルにページネーションモジュールをインポートする必要があります。
import {MatPaginatorModule} from '@angular/material/paginator';
@NgModule({
imports: [MatPaginatorModule]
})
それがあなたのために働くことを願っています。
wesley Coetzeeの回答に基づいて、私はこれを書きました。それがこの問題をグーグルでだれでも助けることを望む。リストの中央でページネーターのサイズを入れ替えるバグがあったので、答えを提出しました。
ページングHTMLおよびリスト
<mat-paginator [length]="localNewspapers.length" pageSize=20
(page)="getPaginatorData($event)" [pageSizeOptions]="[10, 20, 30]"
showFirstLastButtons="false">
</mat-paginator>
<mat-list>
<app-newspaper-pagi-item *ngFor="let paper of (localNewspapers |
slice: lowValue : highValue)"
[newspaper]="paper">
</app-newspaper-pagi-item>
コンポーネントロジック
import {Component, Input, OnInit} from "@angular/core";
import {PageEvent} from "@angular/material";
@Component({
selector: 'app-uniques-newspaper-list',
templateUrl: './newspaper-uniques-list.component.html',
})
export class NewspaperUniquesListComponent implements OnInit {
lowValue: number = 0;
highValue: number = 20;
{...} // not relevant logic
// used to build an array of papers relevant at any given time
public getPaginatorData(event: PageEvent): PageEvent {
this.lowValue = event.pageIndex * event.pageSize;
this.highValue = this.lowValue + event.pageSize;
return event;
}
}
これに数時間を費やした後、これがページネーションを適用する最良の方法だと思います。さらに重要なことは、それが機能することです。これは私のページネーターコード<mat-paginator #paginatoR [length]="length" [pageSize]="pageSize" [pageSizeOptions]="pageSizeOptions">
です
コンポーネント@ViewChild(MatPaginator) paginator: MatPaginator;
内で子を表示し、最後にpaginatorをテーブルdataSourceにバインドする必要があります。これがngAfterViewInit() {this.dataSource.paginator = this.paginator;}
の簡単な方法です。それがあなたのために働くなら、これを答えとしてマークしてください。