Al avanzar al segundo argumento de las peticiones tipo GET un objeto params, Angular automaticamente convertirá las variables que entregues en ?offset=0&limit=10, utilizando sus respectivos nombres.
En este ejemplo, las variables offset y limit suelen utilizarse para crear un paginador de registros. Offset (a veces también llamado "skip") indica desde qué posición de la cantidad total de registros el backend tiene que devolver y Limit la cantidad total.
Al realizar la petición al backend, estamos indicando que devuelva desde la posición 0 un total de 10 registros. Si pasáramos los parámetros (30, 15), estaríamos indicando que desde el registro número 30 nos devuelva una cantidad de 15.
Un buen backend suele permitir este tipo de paginación y dinamismo en sus endpoints que devuelven grandes cantidades de registros.
Contribución creada por: Kevin Fiorentino.
Paginación de Productos con Parámetros URL en Angular
Si se ejecuta el método getAllProducts(), la condición if(limit && offset) al principio se evalula a falso porque offset inicia con un valor de 0, entonces al evaluar un 0 es falso
Para este ejemplo encontre la manera de optimizarlo y realizar esta acción de forma automática, para ello usé el evento scroll donde se comprueba cuando el mismo llegue al final de la pagina y ejecute el evento loadMore()
Totalmente de acuerdo, no tiene nada teórico, debes buscar información en la pagina oficial de angular, no es el fin del mundo, pero podrías leer y reforzar a medida que ves y escuchas el video
Saludos, podrías compartir tu repo para verlo en funcionamiento.
Para el caso de angular 10, el httpParams me toma solo valores string, así que tuve que transformarlos al momento de enviar la petición; De lo contrario se genera :
No overload matches this call.
Overload 3 of 15, '(url: string, options?: { headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: "body"; params?: HttpParams | { [param: string]: string | string[]; }; reportProgress?: boolean; responseType?: "json"; withCredentials?: boolean; }): Observable<...>', gave the following error.
De esta forma se limpiara el array de productos cada vez que presionemos el botón y no aumentarán la cantidad de imagenes, cargando solo 12
// METODO LLAMADO EN NGONINITngOnInit():void{//Metodo para utilizar el paginator y no utilizar doble códigothis.loadMorePages()}paginationLimit: number =12;paginationOffset: number =13//EL METODO EN EL COMPONENTEloadMorePages(){this.productService.getPaginatedProducts(this.paginationLimit,this.paginationOffset).subscribe(data=>{//Puedo utilizar el spread syntax de JS para concatenar el array de products, con el array de datathis.products=[...this.products,...data]//Puedo concatenar el array con el método concat//* this.products = this.products.concat(data)this.paginationOffset+=this.paginationLimit;this.products=[]this.products=[...this.products,...data]})}//EN EL HTML HASTA ABAJO COLCAR:<button
[ngStyle]="{display:'inline-block', 'margin-block-end.px':20, 'margin-block-start.px':40,'height.px':50, 'width.%':100}"(click)="loadMorePages()">Página siguiente</button>
Para especificar de manera dinámica los parametros que se pasaran a la url, se puede usar la función constructora HttpParams del paquete @angular/common/http.
no es necesario des-subscribirse?
en mucha documentación e visto que hacen énfasis en esto, pero aquí no lo hacen, no es necesario? que debemos tener en cuenta para des-suscribirnos?
Pensando más enfocado al usuario, he añadido un limite de productos por página editable por el usuario, lo comparto a continuación:
HTML:
<button(click)="createNewProduct()">Create</button><section class="limitSelector"><label for="limitInput">Limite de productos por página</label><input type="number" name="limitInput"[(ngModel)]="limitInput" step="5" min="10" max="50"><button *ngIf="limit != limitInput; else limitInputDisabled"(click)="changePageLimit()">Guardar</button><ng-template #limitInputDisabled><button disabled>Guardar</button></ng-template></section>
COMPONENT - atributos:
limit =10; offset =0; limitInput =10;
COMPONENT - ngOnInit:
ngOnInit():void{// Default configuration of paginationthis.limit=10;this.offset=0;this.limitInput=10;this.loadProductsBypage();}
COMPONENTE - funciones:"
loadProductsBypage(){this.productsService.getProductsByPage(this.limit,this.offset).subscribe(data=>{this.products=this.products.concat(data);});}loadMore(){this.offset+=this.limit;const data =this.loadProductsBypage();}changePageLimit(){this.limit=this.limitInputthis.offset=0;this.products=[];this.loadProductsBypage();}
paginación tradicional, sin cargar por debajo, solo trayendo la página correspondiente con los productos que están en el limit, lo suyo sería hacer una transición con css para cargar los productos, y si los botones no pertenecieran al products.component sinó al main o al app, no desparecerían, en cada carga, ...