Es ist ganz einfach. Lassen Sie uns sagen, dass wir ein Verfahren in unserem ListComponent haben, die die Seite und hält alle anderen Parameter intakt (wie Suche bezogenen Parameter verändert - nicht die Seite wechseln und vergessen wir die Suche nach etwas :):
page (page) {
this.list.page = page;
this._router.navigate([this.list.route, _.assign(this._params.params, { page: page })]);
this.update(); // Update your list of items here
}
I verwendet Unterstreichen Sie, um der vorhandenen Zuordnung von Parametern aus meinem privaten, injizierten RouteParams-Objekt einen Seitenparameter zuzuweisen. Diese Karte wird aktualisiert, um zu navigieren, also sind wir alle gut, nur erinnern Sie sich, dass Sie es nicht direkt ändern können, es ist unveränderlich.
Hier ist meine Implementierung einer Liste von Artikeln zusammen mit einer Paginierung Komponente als Richtlinie verwendet Paginierung zur Verfügung zu stellen:
ArticleListComponent:
@Component({
selector: 'articles',
templateUrl: './article/list/index.html',
directives: [PaginationComponent],
providers: [ArticleService]
})
export class ArticleListComponent implements OnInit {
list: ArticleList = new ArticleList;
private _urlSearchParams: URLSearchParams = new URLSearchParams;
constructor (
private _article: ArticleService,
private _router: Router,
private _params: RouteParams,
private _observable: ObservableUtilities
) {}
update() {
this._observable.subscribe(this._article.retrieveRange(this.list));
}
ngOnInit() {
let page = this._params.get("page");
if(page) {
this.list.page = Number(page);
}
// check for size in cookie 'articles-per-page'
let title = this._params.get("title");
if (title) {
this.list.title = title;
}
this.update();
}
size (size: number) {
// set cookie 'articles-per-page'
}
page (page) {
this.list.page = page;
this._router.navigate([this.list.route, _.assign(this._params.params, { page: page })]);
this.update();
}
search() {
this.list.page = 1;
let params = _.pick({
title: this.list.title
}, _.identity);
this._router.navigate([this.list.route, params ]);
}
}
PaginationComponent:
import { Component, Input, Output, EventEmitter, OnInit } from 'angular2/core';
import { RouteParams } from 'angular2/router';
import _ from 'underscore';
import { List } from '../common/abstract';
@Component({
selector: 'pagination',
templateUrl: './pagination/index.html'
})
export class PaginationComponent implements OnInit {
@Input() list: List;
@Output() change = new EventEmitter<number>();
pages: Array<number> = [];
constructor(
private _params: RouteParams
) {}
ngOnInit() {
this.pages = _.range(1, this.list.pages + 1);
}
onClick (page: number) {
if (page > 0 && page <= this.list.pages) {
this.change.emit(page);
}
return false;
}
href (page: number) {
return `${this.list.uri}?${_.map(_.assign(this._params.params, { page: page }), (value, param) => `${param}=${value}`).join('&')}`;
}
first (page) {
return page == 1 ? 1 : null;
}
last(page) {
return page == this.list.pages ? this.list.pages : null;
}
}
Paginierung Vorlage (index.html) - Ich benutze Bootstrap für das Styling
<div>
<ul class="pagination">
<li [class.disabled]="first(list.page)"><a (click)="onClick(list.page - 1)" [attr.href]="href(list.page - 1)">«</a></li>
<template ngFor let-page [ngForOf]="pages">
<li *ngIf="(page >= list.page - 2 && page <= list.page + 2) || first(page) || last(page)" [ngSwitch]="(page != list.page - 2 && page != list.page + 2) || first(page) || last(page)" [class.active]="page == list.page">
<a *ngSwitchWhen="true" (click)="onClick(page)" [attr.href]="href(page)">{{page}}</a>
<a *ngSwitchDefault (click)="onClick(page)" [attr.href]="href(page)">...</a>
</li>
</template>
<li [class.disabled]="last(list.page)"><a (click)="onClick(list.page + 1)" [attr.href]="href(list.page + 1)">»</a></li>
</ul>
</div>
Verwendung in Artikeln Listenvorlage:
...
<pagination *ngIf="list.pages > 1" [(list)]="list" (change)="page($event)" class="text-center"></pagination>
...
Der Artikel Dienst in meinem kleinen Projekt fordert eine Reihe von Artikeln aus dem Server des Range-Header verwendet wird.
Ich hoffe, Sie finden dies hilfreich!
Die Paging-Komponente wird an mehreren Stellen wiederverwendet, sodass die Parameter, die an den RouterLink übergeben werden müssen, nicht bekannt sind. Das würde auch zusätzliche Routenparameter verlieren, die seither hinzugefügt wurden (z. B. zusätzliche Filter). –