web-dev-qa-db-ja.com

マテリアルアングルからのページネーションの使用方法

私はangularが初めてで、アプリにページネーションを実装しようとしています。 この材料コンポーネント を使用しようとしています

以下のコードを使用すると、.tsファイルでlengthpagesize、およびpageSizeOptionsを取得できます

<md-paginator [length]="length"
              [pageSize]="pageSize"
              [pageSizeOptions]="pageSizeOptions"
</md-paginator>
export class PaginatorConfigurableExample {

  length = 100;
  pageSize = 10;
  pageSizeOptions = [5, 10, 25, 100];

  }
}

しかし、ページが変更されたときに上記のテーブルのデータを変更する関数をトリガーすることはできません。また、nextPagepreviousPagehasNextPage、およびhasPreviousPageメソッドを使用するにはどうすればよいですか?

26
HeisenBerg

ここでも同じことに苦労しています。しかし、私はいくつかの研究を行っていることをお見せできます。基本的に、最初に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イベントを処理する必要はありません。

これがあなたのお役に立てば幸いです。成功したかどうか教えてください。 =]

31
aelkz

ねえ、私はこれにつまずいてそれを機能させました、ここに方法があります:

私の内部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メソッド内から行われます。このメソッドは、skiptakeを計算し、それをMaterialテーブルのdataSourceに割り当てます。

14
Wesley Coetzee

スライスパイプを使用して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;
 }
8
Asridh Kumar

元の質問の問題は、「ページ」イベントをキャプチャしていないことです。これを解決するには、md-paginatorタグの属性として(page)='yourEventHandler($event) 'を追加する必要があります。

動作例を確認してください here

APIドキュメントも確認できます here

3
LH7

成分:

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>
2
Viree

この問題は数時間を費やして解決し、動作するようになりました。これは、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]
    })

それがあなたのために働くことを願っています。

1
gunjan girdhar

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;
  }

}
1
avokado

これに数時間を費やした後、これがページネーションを適用する最良の方法だと思います。さらに重要なことは、それが機能することです。これは私のページネーターコード<mat-paginator #paginatoR [length]="length" [pageSize]="pageSize" [pageSizeOptions]="pageSizeOptions">です

コンポーネント@ViewChild(MatPaginator) paginator: MatPaginator;内で子を表示し、最後にpaginatorをテーブルdataSourceにバインドする必要があります。これがngAfterViewInit() {this.dataSource.paginator = this.paginator;}の簡単な方法です。それがあなたのために働くなら、これを答えとしてマークしてください。

0
Chetan Sharma