Настроить пагинацию на Angular2 и Bootstrap

159
12 апреля 2018, 13:03

Добрый день! Нужна помощь знающих, который день мучаю пагинацию на Bootstrap в Angular-приложении, но не могу понять как заставить правильно работать стрелки влево-вправо. В добавок все работает на потоках.
Собственно сам код:

import { Component, OnInit} from '@angular/core'; 
import { $inject } from 'app/shared'; 
 
import { Observable } from 'rxjs/Observable'; 
import { Subject } from 'rxjs/Subject'; 
import { map, distinctUntilChanged, pluck, combineLatest, startWith, filter} from 'rxjs/operators'; 
 
import { length, prop, compose, splitEvery, take, last, not, isNil } from 'ramda'; 
 
import { rxAdapter } from 'app/utils'; 
 
@Component({ 
    selector: 'app-ticket-list', 
    template, 
}) 
export class TicketListComponent implements OnInit { 
 
  private showTicketQuestion: Function; 
 
  private ticketStore: any; 
 
  private tickets$: Observable<any>; 
  private ticketsPart$: Observable<any>; 
  private itemsPerPage$: Observable<any>; 
  private showPagination$: Observable<any>; 
  private count$: Observable<any>; 
 
// создаем поток currentPage$ 
  private currentPage$: Subject<any> = new Subject(); 
 
  constructor(private $inject: $inject) { 
  // тут ижектим стор из первого ангуляра 
    this.ticketStore = this.$inject.get('TicketStore'); 
 
// эта штука превращает стор в поток из rxjs5 
    this.ticketStore$ = rxAdapter(this.ticketStore); 
 
// получаем из стора количество элементов на странице 
    this.itemsPerPage$ = this.ticketStore$.pipe( 
      pluck('itemsPerPage'), 
      distinctUntilChanged() 
    ); 
 
// тут получаем из стора массив тикетов и пилим его на массив массивов, в каждом вложенном 
// массиве ровно столько элементов, сколько должно быть на странице 
    this.tickets$ = rxAdapter(this.ticketStore.tickets$).pipe( 
      combineLatest( 
        this.itemsPerPage$, 
        (tickets, pages) => splitEvery(pages, tickets) 
      )); 
 
// тут мы апдейтим созданный ранее поток currentPage$, и если в потоке showPaginations$ 
// содержится true, то стразу показываем первую страницу 
// механизм такой - получаем поток currentPage$, объединяем его с потоком в котором массив 
// масивов, берем первые несколько элементов из него (если currentPage$ = 1, то один, если  
// currentPage$ = 4, то 4 эелемента) и из них выбираем последний и все это прокидывается 
// в вьюху 
    this.ticketsPart$ = this.currentPage$.pipe( 
      startWith(1), 
      combineLatest(this.tickets$, compose(last, take)), 
      filter(compose(not, isNil)) 
    ); 
 
// отвечает за показ пагинации, возврщает true/false 
    this.showPagination$ = this.ticketStore$.pipe( 
      pluck('showPagination'), 
      distinctUntilChanged() 
    ); 
     
// отвечает за количество кнопок в пагинации 
    this.count$ = rxAdapter(this.ticketStore.tickets$).pipe(map(length)); 
  } 
 
// тут мы просто ожидаем подгрузки тикетов до отрисовки 
  ngOnInit(): void { 
    this.ticketStore.load(); 
  } 
 
// собственно вот тут мы перезаписываем страницу в currentPage$, после чего снова запускается 
// ticketsPart$ с уже новыми параметрами 
  changePage(val): void { 
    this.currentPage$.next(val); 
  } 
}
<table *ngFor="let ticket of ticketsPart$ | async"> 
  <tr [ngClass]="[ticket.css_status_class]"> 
    <td [innerHTML]="[ticket.id]"></td> 
    <td> 
      <a [routerLink]="['${I18n.locale}/tickets', ticket.id]"> 
            {{ ticket.title }} 
           </a> 
    </td> 
    <td [innerHTML]="ticket.updated_at"></td> 
  </tr> 
</table> 
 
<nav *ngIf="showPagination$ | async"> 
  <ngb-pagination  
  [(page)]="currentPage",  
  [collectionSize]="count$ | async",  
  [pageSize]="itemsPerPage$ | async",  
  [directionLinks]="true",  
  (pageChange)="changePage($event)"> 
  </ngb-pagination> 
</nav>

Смысл в том, что при нажатии на номер страницы в отрисованной пагинации, в changePage($event) прокидывается именно число и я не могу понять как в этой функции определить нажатие на номер страницы, чтобы его перезаписать, или на стрелку, да еще и на какую именно, чтобы увеличить или уменьшить уже имеющийся номер этой страницы. Как это сделать? Очень нужны идеи для понимания.

READ ALSO
Как настроить анимацию react-burger-menu in react.js

Как настроить анимацию react-burger-menu in react.js

Использую этот https://negomigithub

233
API инстаграма в owlcarousel?

API инстаграма в owlcarousel?

Одно фото попадает в слайдер, все остальные выводятся отдельноПодскажите пожалуйста

114