概要
1ページに10枚のメモを表示するPaginationを実装します。 Springの標準ライブラリのPageを使うといい感じにPaginationしてくれるので、Angularで適宜デバッグしながらcontentやtotalPagesなどのSpringからのレスポンスがあるのだなと確認・利用していく流れです。Spring
MemoRepository.java
public interface MemoRepository extends JpaRepository<Memo, Long> {
Page<Memo> findAll(Pageable pageable);
}
MemoController.java
@CrossOrigin(origins = "http://localhost:4200")
@RestController
public class MemoController {
@Autowired
MemoRepository memoRepository;
/**
* メモをページに応じて取得
*/
@GetMapping("/{page}")
public Page<Memo> getMemos(@PathVariable("page") int page) throws IOException {
//PageRequestはバージョンによって書き方が違うので注意が必要
return memoRepository.findAll(PageRequest.of(page,10,Sort.by(Sort.Direction.ASC, "id")));
}
}
Angular
home.component.html
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
<li class="page-item"><a class="page-link" (click)="prevMemo()">前へ</a></li>
<li *ngFor="let in of pageCounter(totalPages) ; let i = index" class="page-item"><a class="page-link" (click)="clickPage(i)">{{i}}</a></li>
<li class="page-item"><a class="page-link" (click)="nextMemo()">次へ</a></li>
</ul>
</nav>
home.component.ts
export class HomeComponent implements OnInit {
memos: Memo[];
memo: Memo = {
japanese: '',
};
totalPages: number = 0;
currentPage: number = 0;
constructor(private service: MemoService){}
/**
* 初期表示時、メモを取得。デフォルトは0ページ。
*/
ngOnInit(): void {
this.getMemos(this.currentPage);
}
/**
* メモ取得。
*/
getMemos(page: number) {
this.service.getMemos(this.currentPage).subscribe(data => {
this.memos = data.content;
this.totalPages = data.totalPages;
});
}
/**
* 「前へ」押下時、1ページ後ろのページに応じてメモを取得。
*/
prevMemo(){
if(this.currentPage !== 0){
this.currentPage = this.currentPage -1;
this.getMemos(this.currentPage);
}
}
/**
* 「次へ」押下時、1ページ先のページに応じてメモを取得。
*/
nextMemo(){
if(this.currentPage !== this.totalPages -1){
this.currentPage = this.currentPage +1;
this.getMemos(this.currentPage);
}
}
/**
* ページ押下時、ページに応じてメモを取得。
*/
clickPage(i: number){
this.currentPage = i;
this.getMemos(this.currentPage);
}
/**
* ページ件数を動的に表示する。
*/
pageCounter(i: number){
return new Array(i);
}
}