Skip to content

Commit fe02615

Browse files
author
Jaume Segarra
committed
chore: angular 17 pagination models explained
1 parent ea5532e commit fe02615

4 files changed

Lines changed: 46 additions & 1 deletion

File tree

docs/develop/paginated/angular17.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,17 @@ Por defecto, el esquema de datos de Spring para la paginación es como el siguie
7272

7373
Así que necesitamos poder enviar y recuperar esa información desde Angular, nos hace falta crear esos objetos. Los objetos de paginación, al ser comunes a toda la aplicación, vamos a crearlos en `core/model/page`.
7474

75+
!!! info "¿Por qué en `core/model/page` y no dentro del componente `author`?"
76+
`SortPage`, `Pageable` y `PaginatedData` **no pertenecen al dominio de negocio de `Author`**; son contratos técnicos que describen cómo se comunica el frontend con el backend cuando los datos vienen paginados.
77+
78+
Cualquier otro listado de la aplicación —categorías, préstamos, juegos…— necesitará exactamente estos mismos objetos. Si los metiéramos dentro de `author/`, el día que quisiéramos paginar otro listado tendríamos dos opciones igual de malas: duplicar el código o importar clases de un módulo que no tiene nada que ver con tu entidad.
79+
80+
Colocarlos en `core/` sigue el principio de **reutilización y responsabilidad única**:
81+
82+
- Un único lugar donde mantener el contrato de paginación.
83+
- Si el backend cambia el esquema (p. ej. renombra `pageNumber` a `page`), sólo hay que tocar un fichero.
84+
- Cualquier desarrollador que llegue al proyecto sabrá dónde buscarlos sin tener que adivinar en qué módulo de negocio están escondidos.
85+
7586
=== "SortPage.ts"
7687
``` TypeScript
7788
export class SortPage {
@@ -100,6 +111,19 @@ Así que necesitamos poder enviar y recuperar esa información desde Angular, no
100111
}
101112
```
102113

114+
!!! info "¿Qué es `<TData>`?"
115+
`<TData>` es un **genérico de TypeScript** (el equivalente a los *generics* de Java `<T>` o de C# `<T>`).
116+
117+
Permite que `PaginatedData` sea una clase **reutilizable con cualquier tipo de contenido**, sin necesidad de crear una clase distinta para cada entidad:
118+
119+
```typescript
120+
PaginatedData<Author> // content será Author[]
121+
PaginatedData<Category> // content será Category[]
122+
PaginatedData<Loan> // content será Loan[]
123+
```
124+
125+
TypeScript verifica el tipo en tiempo de compilación, por lo que si intentas acceder a una propiedad que no existe en `Author` dentro de un `PaginatedData<Author>`, el compilador te avisará de inmediato. Obtienes reutilización **y** seguridad de tipos al mismo tiempo.
126+
103127
Con estos objetos creados ya podemos implementar el servicio y sus datos mockeados.
104128

105129
=== "mock-authors.ts"

site/develop/paginated/angular17/index.html

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2301,6 +2301,17 @@ <h2 id="implementar-servicio">Implementar servicio</h2>
23012301
</div>
23022302
</div>
23032303
<p>Así que necesitamos poder enviar y recuperar esa información desde Angular, nos hace falta crear esos objetos. Los objetos de paginación, al ser comunes a toda la aplicación, vamos a crearlos en <code>core/model/page</code>.</p>
2304+
<div class="admonition info">
2305+
<p class="admonition-title">¿Por qué en <code>core/model/page</code> y no dentro del componente <code>author</code>?</p>
2306+
<p><code>SortPage</code>, <code>Pageable</code> y <code>PaginatedData</code> <strong>no pertenecen al dominio de negocio de <code>Author</code></strong>; son contratos técnicos que describen cómo se comunica el frontend con el backend cuando los datos vienen paginados.</p>
2307+
<p>Cualquier otro listado de la aplicación —categorías, préstamos, juegos…— necesitará exactamente estos mismos objetos. Si los metiéramos dentro de <code>author/</code>, el día que quisiéramos paginar otro listado tendríamos dos opciones igual de malas: duplicar el código o importar clases de un módulo que no tiene nada que ver con tu entidad.</p>
2308+
<p>Colocarlos en <code>core/</code> sigue el principio de <strong>reutilización y responsabilidad única</strong>:</p>
2309+
<ul>
2310+
<li>Un único lugar donde mantener el contrato de paginación.</li>
2311+
<li>Si el backend cambia el esquema (p. ej. renombra <code>pageNumber</code> a <code>page</code>), sólo hay que tocar un fichero.</li>
2312+
<li>Cualquier desarrollador que llegue al proyecto sabrá dónde buscarlos sin tener que adivinar en qué módulo de negocio están escondidos.</li>
2313+
</ul>
2314+
</div>
23042315
<div class="tabbed-set tabbed-alternate" data-tabs="4:3"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio" /><input id="__tabbed_4_2" name="__tabbed_4" type="radio" /><input id="__tabbed_4_3" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="__tabbed_4_1">SortPage.ts</label><label for="__tabbed_4_2">Pageable.ts</label><label for="__tabbed_4_3">PaginatedData.ts</label></div>
23052316
<div class="tabbed-content">
23062317
<div class="tabbed-block">
@@ -2332,6 +2343,16 @@ <h2 id="implementar-servicio">Implementar servicio</h2>
23322343
</div>
23332344
</div>
23342345
</div>
2346+
<div class="admonition info">
2347+
<p class="admonition-title">¿Qué es <code>&lt;TData&gt;</code>?</p>
2348+
<p><code>&lt;TData&gt;</code> es un <strong>genérico de TypeScript</strong> (el equivalente a los <em>generics</em> de Java <code>&lt;T&gt;</code> o de C# <code>&lt;T&gt;</code>).</p>
2349+
<p>Permite que <code>PaginatedData</code> sea una clase <strong>reutilizable con cualquier tipo de contenido</strong>, sin necesidad de crear una clase distinta para cada entidad:</p>
2350+
<div class="highlight"><pre><span></span><code><span class="nx">PaginatedData</span><span class="o">&lt;</span><span class="nx">Author</span><span class="o">&gt;</span><span class="w"> </span><span class="c1">// content será Author[]</span>
2351+
<span class="nx">PaginatedData</span><span class="o">&lt;</span><span class="nx">Category</span><span class="o">&gt;</span><span class="w"> </span><span class="c1">// content será Category[]</span>
2352+
<span class="nx">PaginatedData</span><span class="o">&lt;</span><span class="nx">Loan</span><span class="o">&gt;</span><span class="w"> </span><span class="c1">// content será Loan[]</span>
2353+
</code></pre></div>
2354+
<p>TypeScript verifica el tipo en tiempo de compilación, por lo que si intentas acceder a una propiedad que no existe en <code>Author</code> dentro de un <code>PaginatedData&lt;Author&gt;</code>, el compilador te avisará de inmediato. Obtienes reutilización <strong>y</strong> seguridad de tipos al mismo tiempo.</p>
2355+
</div>
23352356
<p>Con estos objetos creados ya podemos implementar el servicio y sus datos mockeados.</p>
23362357
<div class="tabbed-set tabbed-alternate" data-tabs="5:2"><input checked="checked" id="__tabbed_5_1" name="__tabbed_5" type="radio" /><input id="__tabbed_5_2" name="__tabbed_5" type="radio" /><div class="tabbed-labels"><label for="__tabbed_5_1">mock-authors.ts</label><label for="__tabbed_5_2">author.service.ts</label></div>
23372358
<div class="tabbed-content">

site/search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

site/sitemap.xml.gz

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)