Angular 4が初めてで、誰かがテーブルにページネーションを追加する方法を教えていただければ幸いです。以下にコードを示します。
HTML:
<div *ngIf="tableDiv && adv1" id="adv1Div">
<table class="table table-hover" id="adv1Table">
<thead>
<tr class="black-muted-bg" >
<th class="align-right" *ngFor="let data of calendarTable[0].weeks">{{data.period}}</th>
</tr>
</thead>
<tbody>
<tr class="no-top-border" *ngFor="let item of calendarTable| paginate: { itemsPerPage: 9, currentPage: p };">
<td contenteditable='true' *ngFor="let data of item.weeks| paginate: { itemsPerPage: 9, currentPage: p };" class="align-right">{{data.price}}</td>
</tr>
</tbody>
<a href="javascript:void(0)">
{{p}}
</a>
</table>
</div>
そして私のJSONは:
public calendarTable = [
{ name: "TV AD1",
weeks: [
{ period: "2/10/2017", price: "400" },
{ period: "9/10/2017", price: "800" },
{ period: "16/10/2017", price: "200" },
{ period: "23/10/2017", price: "500" },
{ period: "30/10/2017", price: "600" },
{ period: "6/11/2017", price: "800" },
{ period: "13/11/2017", price: "700" },
{ period: "20/11/2017", price: "800" },
{ period: "27/11/2017", price: "900" },
{ period: "4/12/2017", price: "400" },
{ period: "11/12/2017", price: "800" },
{ period: "18/12/2017", price: "200" },
{ period: "25/12/2017", price: "500" },
{ period: "1/1/2018", price: "600" },
{ period: "8/1/2018", price: "800" },
{ period: "15/1/2018", price: "700" },
{ period: "22/1/2018", price: "800" },
{ period: "29/1/2018", price: "900" }
]
}
]
テーブルのページごとに5つのアイテムを追加したい。この点で私を助けてください。
Angular 4にngx-paginationがインストールされているシンプルなソリューションは、 here にあります。必要なのは、ngModuleにインポートし、コンポーネントでページインデックスを宣言することです。 .ts as p: number = 1;
。
以下に示すように、テーブルの下でページネーション要素を見つけます。
<pagination-controls (pageChange)="p = $event"></pagination-controls>
* ngFor //:に表示する行数を宣言します。
<tr *ngFor="let game of games | paginate: { itemsPerPage: 5, currentPage: p }; let i = index">
それがあなたを助けることを願っています!
チュートリアルを確認できます こちら
デモを見つけることができます こちら
更新:-チェック ここ
更新2:-
上記のチュートリアルには、実際にこの基本ロジックがあります。
1)。最大10個のリンクが一度に表示されます。
2)。アクティブなページは、アクティブなページが最後の位置から5より上または4より下の場合、6番目の位置です。
ページネーションロジック(再利用できるようにサービスとして追加):-
import * as _ from 'underscore';
export class PagerService {
getPager(totalItems: number, currentPage: number = 1, pageSize: number = 10) {
// calculate total pages
let totalPages = Math.ceil(totalItems / pageSize);
let startPage: number, endPage: number;
if (totalPages <= 10) {
// less than 10 total pages so show all
startPage = 1;
endPage = totalPages;
} else {
// more than 10 total pages so calculate start and end pages
if (currentPage <= 6) {
startPage = 1;
endPage = 10;
} else if (currentPage + 4 >= totalPages) {
startPage = totalPages - 9;
endPage = totalPages;
} else {
startPage = currentPage - 5;
endPage = currentPage + 4;
}
}
// calculate start and end item indexes
let startIndex = (currentPage - 1) * pageSize;
let endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);
// create an array of pages to ng-repeat in the pager control
let pages = _.range(startPage, endPage + 1);
// return object with all pager properties required by the view
return {
totalItems: totalItems,
currentPage: currentPage,
pageSize: pageSize,
totalPages: totalPages,
startPage: startPage,
endPage: endPage,
startIndex: startIndex,
endIndex: endIndex,
pages: pages
};
}
}
ページネーションサービスを使用するコンポーネント:-
import { Component, OnInit } from '@angular/core';
import { Http, Headers, RequestOptions, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map'
import * as _ from 'underscore';
import { PagerService } from './_services/index'
@Component({
moduleId: module.id,
selector: 'app',
templateUrl: 'app.component.html'
})
export class AppComponent implements OnInit {
constructor(private http: Http, private pagerService: PagerService) { }
// array of all items to be paged
private allItems: any[];
// pager object
pager: any = {};
// paged items
pagedItems: any[];
ngOnInit() {
// get dummy data
this.http.get('./dummy-data.json')
.map((response: Response) => response.json())
.subscribe(data => {
// set items to json response
this.allItems = data;
// initialize to page 1
this.setPage(1);
});
}
setPage(page: number) {
if (page < 1 || page > this.pager.totalPages) {
return;
}
// get pager object from service
this.pager = this.pagerService.getPager(this.allItems.length, page);
// get current page of items
this.pagedItems = this.allItems.slice(this.pager.startIndex, this.pager.endIndex + 1);
}
}
HTMLテンプレート:-
<div>
<div class="container">
<div class="text-center">
<h1>Angular 2 - Pagination Example with logic like Google</h1>
<!-- items being paged -->
<div *ngFor="let item of pagedItems">{{item.name}}</div>
<!-- pager -->
<ul *ngIf="pager.pages && pager.pages.length" class="pagination">
<li [ngClass]="{disabled:pager.currentPage === 1}">
<a (click)="setPage(1)">First</a>
</li>
<li [ngClass]="{disabled:pager.currentPage === 1}">
<a (click)="setPage(pager.currentPage - 1)">Previous</a>
</li>
<li *ngFor="let page of pager.pages" [ngClass]="{active:pager.currentPage === page}">
<a (click)="setPage(page)">{{page}}</a>
</li>
<li [ngClass]="{disabled:pager.currentPage === pager.totalPages}">
<a (click)="setPage(pager.currentPage + 1)">Next</a>
</li>
<li [ngClass]="{disabled:pager.currentPage === pager.totalPages}">
<a (click)="setPage(pager.totalPages)">Last</a>
</li>
</ul>
</div>
</div>
</div>
更新3:-
よりシンプルなアプローチ...複数のボタンで変更できるトグルロジックを備えた単一のボタンを提供しましたが
@Component({
selector: 'my-app',
template:`
<div>
<h5>TV ADS</h5>
<ul>
<li *ngFor="let item of calendarTableSelected.weeks">
<span>{{item.period}}</span>
</li>
</ul>
</div>
<div>
<button (click)="update()">change</button>
</div>
`
})
export class SomeComponent {
public calendarTable = [
{ name: "TV AD1",
weeks: [
{ period: "2/10/2017", price: "400" },
{ period: "9/10/2017", price: "800" },
{ period: "16/10/2017", price: "200" },
{ period: "23/10/2017", price: "500" },
{ period: "30/10/2017", price: "600" },
{ period: "6/11/2017", price: "800" },
{ period: "13/11/2017", price: "700" },
{ period: "20/11/2017", price: "800" },
{ period: "27/11/2017", price: "900" },
{ period: "4/12/2017", price: "400" },
{ period: "11/12/2017", price: "800" },
{ period: "18/12/2017", price: "200" },
{ period: "25/12/2017", price: "500" },
{ period: "1/1/2018", price: "600" },
{ period: "8/1/2018", price: "800" },
{ period: "15/1/2018", price: "700" },
{ period: "22/1/2018", price: "800" },
{ period: "29/1/2018", price: "900" }
]
},
{ name: "TV AD2",
weeks: [
{ period: "2/10/2017", price: "500" },
{ period: "9/10/2017", price: "600" },
{ period: "16/10/2017", price: "700" },
{ period: "23/10/2017", price: "800" },
{ period: "30/10/2017", price: "900" },
{ period: "6/10/2017", price: "100" },
{ period: "13/10/2017", price: "200" },
{ period: "20/10/2017", price: "300" },
{ period: "27/10/2017", price: "400" },
{ period: "4/12/2017", price: "400" },
{ period: "11/12/2017", price: "800" },
{ period: "18/12/2017", price: "200" },
{ period: "25/12/2017", price: "500" },
{ period: "1/1/2018", price: "600" },
{ period: "8/1/2018", price: "800" },
{ period: "15/1/2018", price: "700" },
{ period: "22/1/2018", price: "800" },
{ period: "29/1/2018", price: "900" }
]
},
{ name: "TV AD3",
weeks: [
{ period: "2/10/2017", price: "500" },
{ period: "9/10/2017", price: "600" },
{ period: "16/10/2017", price: "700" },
{ period: "23/10/2017", price: "800" },
{ period: "30/10/2017", price: "900" },
{ period: "6/10/2017", price: "100" },
{ period: "13/10/2017", price: "200" },
{ period: "20/10/2017", price: "300" },
{ period: "27/10/2017", price: "400" },
{ period: "4/12/2017", price: "400" },
{ period: "11/12/2017", price: "800" },
{ period: "18/12/2017", price: "200" },
{ period: "25/12/2017", price: "500" },
{ period: "1/1/2018", price: "600" },
{ period: "8/1/2018", price: "800" },
{ period: "15/1/2018", price: "700" },
{ period: "22/1/2018", price: "800" },
{ period: "29/1/2018", price: "900" }
]
},
{ name: "TV AD4",
weeks: [
{ period: "2/10/2017", price: "500" },
{ period: "9/10/2017", price: "600" },
{ period: "16/10/2017", price: "700" },
{ period: "23/10/2017", price: "800" },
{ period: "30/10/2017", price: "900" },
{ period: "6/10/2017", price: "100" },
{ period: "13/10/2017", price: "200" },
{ period: "20/10/2017", price: "300" },
{ period: "27/10/2017", price: "400" },
{ period: "4/12/2017", price: "400" },
{ period: "11/12/2017", price: "800" },
{ period: "18/12/2017", price: "200" },
{ period: "25/12/2017", price: "500" },
{ period: "1/1/2018", price: "600" },
{ period: "8/1/2018", price: "800" },
{ period: "15/1/2018", price: "700" },
{ period: "22/1/2018", price: "800" },
{ period: "29/1/2018", price: "900" }
]
}
]
calendarTableSelected: Array;
i: number= 0;
constructor() {
this.calendarTableSelected = this.calendarTable[0];
}
update(){
if(this.i == 0){this.i = 1;}else{this.i = 0}// change this acc. to your needed logic or use any of the above provided links to form your logic
this.calendarTableSelected = this.calendarTable[this.i];
}
}
plunkr要求どおり。