Paginazione ibrida Client side/Server side

di il
2 risposte

Paginazione ibrida Client side/Server side

Buongiorno a tutti, sto gestendo una chiamata rest alla mia api Java, la richiesta get con paginazione client side dovrebbe prendere tutti i dati del db e ritornarmeli in un unico array che io poi andro' a gestire e dividere tramite .slice() ecc… Ora, il problema che mi si pone davanti consiste nel limitare la richiesta get sul db a un numero x di record per poi effettuare le richieste successive incrementando offset, questo per leggere in volte separate i dati su db e non appesantire troppo il processo. Qualcuno ha consigli su come effettuare questa cosa? Io stavo implementando queste due funzioni ma non fanno cio' che mi aspettavo.

Il mio ragionamento e' stato il seguente: 

  • effettuo una get in cui mi ritorno i primi 20 record con offset a 0
  • inserisco questi 20 record di Immatricolazioni in un array this.immatricolazioniArray
  • se viene clickata una page tra 5 e 10 allora incremento offset e faccio una nuova chiamata a db con offset a 20, salvo i record trovati in un array this.immatricolazioniArrayRefresh che a mio modo divedere andavo a concatenare con la funzione concat() a immatricolazioniArray
  • Il mio problema e' che quando chiamo refreshResearch() non mi concatena gli array ma mi mostra a tabella al posto dei primi risultati di immatricolazioniArray l'array immatricolazioniArrayRefresh

Secondo me c'e' un problema di async pero' non so come risolvere al momento….

searchByExample() {
    let url = 'http://localhost:8080/RestApiMyBatis/webapi/immatricolazioni?';

    console.log('offset start-> ', this.offset);
    console.log('limit start-> ', this.limit);

    if (this.immatricolazioniGetForm.value.targa) {
      url += 'targa=' + this.immatricolazioniGetForm.value.targa + '&';
    }
    if (this.immatricolazioniGetForm.value.idMoto) {
      url += 'idMoto=' + this.immatricolazioniGetForm.value.idMoto + '&';
    }
    if (this.immatricolazioniGetForm.value.dataImmatricolazioneFrom) {
      url +=
        'dataImmatricolazioneFrom=' +
        this.immatricolazioniGetForm.value.dataImmatricolazioneFrom +
        '&';
    }
    if (this.immatricolazioniGetForm.value.dataImmatricolazioneTo) {
      url +=
        'dataImmatricolazioneTo=' +
        this.immatricolazioniGetForm.value.dataImmatricolazioneTo +
        '&';
    }
    if (this.offset != null) {
      url += 'offset=' + this.offset + '&';
    }
    if (this.limit != null) {
      url += 'limit=' + this.limit + '&';
    }
    //   if (this.orderBy != null) {
    //     url += 'orderBy=' + this.orderBy + '&';
    //   }
    //   if (this.orderHow != null) {
    //     url += 'orderHow=' + this.orderHow + '&';
    //   }
    console.log('url: ', url);

    this.immatricolazioniService
      .getImmatricolazioni(url)
      .subscribe((data: any) => {
        this.immatricolazioniArray = data.listaImmatricolazioni;
        this.totaleRecord = data.totaleRecord;
        // console.log('totaleRecord: ', data.totaleRecord);

        // console.log('this collectionSize', this.immatricolazioniArray.length);

        if (this.incremento == false) {
          if (this.page >= 5 && this.page <= 10) {
            this.currentPage = this.currentPage + 1;
            this.incremento = true;
          }
        }

        this.immatricolazioniPerPage = this.immatricolazioniArray.slice(
          //:=========================================
          (this.page - 1) * this.pageSize,
          (this.page - 1) * this.pageSize + this.pageSize
        );

        this.offset = (this.currentPage - 1) * this.itemsPerPage;
        this.limit = this.itemsPerPage;

        // console.log('offset end-> ', this.offset);
        // console.log('limit end-> ', this.limit);
        // console.log('this page: ', this.page);
        // console.log('this currentPage end->: ', this.currentPage);
        console.log('this immatricolazioniArray: ', this.immatricolazioniArray);

        // console.log('this currentPage: ', this.currentPage);
        this.refreshSearch(this.offset, this.limit);
        console.log(
          'immatricolazioniArrayRefresh: ',
          this.immatricolazioniArrayRefresh
        );

        this.immatricolazioniArrayTOT = this.immatricolazioniArray.concat(
          this.immatricolazioniArrayRefresh
        );
      });
  }

  refreshSearch(offset: number, limit: number) {
    let url = 'http://localhost:8080/RestApiMyBatis/webapi/immatricolazioni?';

    console.log('offset refresh-> ', offset);
    console.log('limit refresh-> ', limit);

    if (this.immatricolazioniGetForm.value.targa) {
      url += 'targa=' + this.immatricolazioniGetForm.value.targa + '&';
    }
    if (this.immatricolazioniGetForm.value.idMoto) {
      url += 'idMoto=' + this.immatricolazioniGetForm.value.idMoto + '&';
    }
    if (this.immatricolazioniGetForm.value.dataImmatricolazioneFrom) {
      url +=
        'dataImmatricolazioneFrom=' +
        this.immatricolazioniGetForm.value.dataImmatricolazioneFrom +
        '&';
    }
    if (this.immatricolazioniGetForm.value.dataImmatricolazioneTo) {
      url +=
        'dataImmatricolazioneTo=' +
        this.immatricolazioniGetForm.value.dataImmatricolazioneTo +
        '&';
    }
    if (this.offset != null) {
      url += 'offset=' + offset + '&';
    }
    if (this.limit != null) {
      url += 'limit=' + limit + '&';
    }
    //   if (this.orderBy != null) {
    //     url += 'orderBy=' + this.orderBy + '&';
    //   }
    //   if (this.orderHow != null) {
    //     url += 'orderHow=' + this.orderHow + '&';
    //   }
    console.log('url: ', url);

    this.immatricolazioniService
      .getImmatricolazioni(url)
      .subscribe((data: any) => {
        this.immatricolazioniArrayRefresh = data.listaImmatricolazioni;
        console.log(
          'immatricolazioniArrayTOT: ',
          this.immatricolazioniArrayRefresh
        );
      });
  }

template HTML

<div class="container-fluid">
          <table class="table table-striped">
            <thead>
              <tr>
                <th scope="col">
                  Targa
                  <span>
                    <button type="button" class="btn btn-light btn-sm">
                      <span textContent="&#9650;">?</span>
                    </button>
                  </span>
                  <span>
                    <button type="button" class="btn btn-light btn-sm">
                      <span textContent="&#9660;">?</span>
                    </button>
                  </span>
                </th>
                <th scope="col" class="text-end">
                  Id Moto
                  <span>
                    <button type="button" class="btn btn-light btn-sm">
                      <span textContent="&#9650;">?</span>
                    </button>
                  </span>
                  <span>
                    <button type="button" class="btn btn-light btn-sm">
                      <span textContent="&#9660;">?</span>
                    </button>
                  </span>
                </th>
                <th scope="col" class="text-end">
                  Data Immatricolazione
                  <span>
                    <button type="button" class="btn btn-light btn-sm">
                      <span textContent="&#9650;">?</span>
                    </button>
                  </span>
                  <span>
                    <button type="button" class="btn btn-light btn-sm">
                      <span textContent="&#9660;">?</span>
                    </button>
                  </span>
                </th>
                <th scope="col" class="text-end"></th>
              </tr>
            </thead>
            <tbody>
              <tr *ngFor="let element of immatricolazioniPerPage; index as i">
                <td>{{ element.targa }}</td>
                <td class="text-end">
                  {{ element.idMoto }}
                </td>
                <td class="text-end">
                  {{
                    this.datePipe.transform(
                      element.dataImmatricolazione.substring(10, 0),
                      "dd/MM/yyyy"
                    )
                  }}
                </td>
                <td class="text-end">
                  <button
                    type="button"
                    class="btn btn-light me-2"
                    (click)="
                      exportImmatricolazioneToPdf(element.idImmatricolazione)
                    "
                  >
                    Esporta in PDF
                  </button>
                  <button
                    type="button"
                    class="btn btn-outline-secondary me-2"
                    (click)="openEditModal(content3, element)"
                  >
                    Modifica
                  </button>
                  <button
                    type="button"
                    class="btn btn-outline-secondary"
                    (click)="
                      openDeleteModal(content4, element.idImmatricolazione)
                    "
                  >
                    Rimuovi
                  </button>
                </td>
              </tr>
              <tr>
                <td></td>
                <td></td>
                <td></td>
                <td></td>
                <td class="text-end fw-bold">Totali</td>
              </tr>
            </tbody>
          </table>
        </div>

2 Risposte

  • Re: Paginazione ibrida Client side/Server side

    17/11/2023 - Bovy98 ha scritto:


    Secondo me c'e' un problema di async pero' non so come risolvere al momento….

    Non saprei di preciso a cosa è dovuto il problema, perché nel codice ci sono troppi array per la gestione di questo scenario: c'è immatricolazioniArray, poi anche immatricolazioniArrayRefresh, poi c'è immatricolazioniPerPage e anche immatricolazioniArrayTOT.

    Non sono un po' troppe? :)

    Il mio suggerimento è quello di semplificare questa logica ripartendo un attimo dal principio e implementando la funzionalità “passo per passo”, così da verificare a ogni passaggio che le cose siano corrette.

    Fai anche una ricerca perché la gestione di una paginazione credo sia stata affrontata spesso, quindi senz'altro troverai articoli o tutorial che ne parlano e danno indicazioni in merito.

  • Re: Paginazione ibrida Client side/Server side

    Lo so ho messo un po' troppi array, per fare delle prove… faccio un giro sul forum allora grazie!

Devi accedere o registrarti per scrivere nel forum
2 risposte