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.
No sé si es una mala práctica... pero para no duplicar la funcionalidad yo simplemente llamo a LoadMore dentro del NgOnInit
ngOnInit():void{this.loadMore()}
Me parece una buena opción, la probé y funciona perfectamente.
Yo también lo hice de esa manera, no creo que se trate de una mala práctica.
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
Por eso los evalue a ambos (limit !== undefined && offset !== undefined)
Muy buen comentario y buena solución.
La ultima explicacion que se hace en el video no me funcionó hasta que cambie el if para que fuera un poco más especifico:
Me pasó igual...Según encontré.. si llegaran valores como: 0, '', false... pues son considerados falsos, por eso no pasa el if del profe, porque offset inicialmente es cero..
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()
Y esto sería un claro ejemplo de como usar una directiva en Angular
Sería bueno tener material teórico además de las clases con código (las cuales son buenas) pero es más que nada para tener algo más conceptual.
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
Gran aporte !!! Buen programador, mejor persona :D
no se requiere un if ya que puedes escapar con un ? y si no viene el valor seria
limit? || 0
offset? || 0
es menos codigo y mas limpio
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();}
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.
Confirmo. Este aporte te saca de la duda existencial que te genera la diapositiva ajjaja
Para el reto de estado inicial de limit y offset tengo dos opciones:
la según es como menciono un compañero en un aporte, que seria llamando el metodo this.loadMore() en el ngOnInit().
Vale interesante, gracias por compartir compañero Sebastian.
Hola, necesito ayuda para configurar esta seccion de seguridad dentro de angular, ya que me esta generando error en la seguridad:
También se podría implementar de esta forma
this.products = [this.products, ...data]
srpead syntax
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?
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, ...