Skip to content

Commit 0c4bea4

Browse files
authored
Merge pull request #788 from Lemoncode/angular-review
Angular review
2 parents 9d2cb12 + 56e993f commit 0c4bea4

58 files changed

Lines changed: 3620 additions & 239 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

04-frameworks/02-angular/01-components/readme_es.md

Lines changed: 77 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Qué vamos a aprender en este ejemplo:
1212

1313
- Crear un componente
1414
- Crear atributos custom al componente con el decorador @Input
15-
- Crear eventos custom con el decorador @Output
15+
- Crear eventos custom con el decorador `@Output`
1616
- Encapsulación de estilos
1717

1818
Pasos:
@@ -25,7 +25,9 @@ Pasos:
2525
npm install
2626
```
2727

28-
- Encendemos la aplicación:
28+
> NOTA: Podemos usar `npm ci` de esta forma instalaremos las dependencias existentes en `package-lock.json` en vez de regenerarlas.
29+
30+
- Arrancamos la aplicación:
2931

3032
```bash
3133
ng serve
@@ -74,6 +76,71 @@ En la pantalla se verá el contenido por defecto del componente Search:
7476
7577
Colocamos el html del componente en el fichero _search.component.html_ y el css del componente en el fichero _search.component.scss_
7678

79+
Update `app/utils/search/search.component.html`
80+
81+
```html
82+
<p></p>
83+
84+
<div class="container">
85+
<input type="text" class="field" />
86+
<div class="icons-container">
87+
<div class="icon-search"></div>
88+
</div>
89+
</div>
90+
```
91+
92+
Update `app/utils/search/search.component.css`
93+
94+
```css
95+
p {
96+
color: blue;
97+
}
98+
99+
.container {
100+
position: relative;
101+
padding: 0;
102+
margin: 0;
103+
border: 0;
104+
width: 150px;
105+
height: 30px;
106+
}
107+
108+
.field {
109+
width: 100%;
110+
height: 100%;
111+
border-radius: 3px;
112+
}
113+
114+
.icons-container {
115+
position: absolute;
116+
top: 5px;
117+
right: -10px;
118+
width: 30px;
119+
height: 30px;
120+
}
121+
122+
.icon-search {
123+
position: relative;
124+
width: 50%;
125+
height: 50%;
126+
opacity: 1;
127+
border-radius: 50%;
128+
border: 3px solid #c7d0f8;
129+
}
130+
131+
.icon-search:after {
132+
content: "";
133+
position: absolute;
134+
bottom: -9px;
135+
right: -2px;
136+
width: 4px;
137+
border-radius: 3px;
138+
transform: rotate(-45deg);
139+
height: 10px;
140+
background-color: #c7d0f8;
141+
}
142+
```
143+
77144
¡Y listo!. El componente debería verse en la pantalla.
78145

79146
### Creación de atributos custom
@@ -100,13 +167,16 @@ export class SearchComponent {
100167
// ...
101168
```
102169
103-
Enlazamos las propiedades de clase en el template, actualizando `src/app/utils/search/search.component.ts`:
170+
Enlazamos las propiedades de clase en el template, actualizando `src/app/utils/search/search.component.html`:
104171
105172
```html
173+
<!-- diff -->
106174
<p>{{ label }}</p>
107-
175+
<!-- diff -->
108176
<div class="container">
177+
<!-- diff -->
109178
<input type="text" [placeholder]="ph" [value]="name" class="field" />
179+
<!-- diff -->
110180
<div class="icons-container">
111181
<div class="icon-search"></div>
112182
</div>
@@ -169,7 +239,7 @@ Actualizamos `src/app/app.component.ts`
169239
export class AppComponent {
170240
title = 'app';
171241

172-
escribeLog($event: string) {
242+
escribeLog($event: Event) {
173243
console.log($event);
174244
}
175245
}
@@ -218,6 +288,8 @@ export class SearchComponent {
218288
219289
### Encapsulación de los estilos
220290
291+
> TODO: Desarrollar estos puntos
292+
221293
Angular encapsula por defecto los estilos, con lo que no tenemos que preocuparnos de ello. No obstante se pueden configurar 3 formas de encapsulación:
222294
223295
- Encapsulación por defecto (Emulated)

04-frameworks/02-angular/02-list-users/readme_es.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Que vamos a aprender en este ejemplo:
1111

1212
- Cómo crear un componente de visualización
1313
- Cómo hacer una llámada asícnrona para pedir datos a una api remota.
14-
- Cómo iterar y mostrar una lista de resultados con la directiva estructural *ngFor
14+
- Cómo iterar y mostrar una lista de resultados con la directiva estructural `*ngFor`
1515

1616
También aprenderemos posteriormente la librería de Angular para realizar peticiones a APIs remotas.
1717

@@ -25,14 +25,15 @@ Pasos:
2525
npm install
2626
```
2727

28-
- Encendemos la aplicación:
28+
> NOTA: Podemos usar `npm ci` de esta forma instalaremos las dependencias existentes en `package-lock.json` en vez de regenerarlas.
29+
30+
- Arrancamos la aplicación:
2931

3032
```bash
3133
ng serve
3234
```
3335

34-
- Si queremos ver que tipo de datos vamos a manejar, podemos abrir el
35-
navegador web y ver que devuelve la API Rest de Github
36+
- Si queremos ver que tipo de datos vamos a manejar, podemos abrir el navegador web y ver que devuelve la API Rest de Github
3637

3738
```bash
3839
https://api.github.com/orgs/lemoncode/members

04-frameworks/02-angular/03-directives/readme_es.md

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ Pasos:
2121
npm install
2222
```
2323

24-
- Encendemos la aplicación:
24+
> NOTA: Podemos usar `npm ci` de esta forma instalaremos las dependencias existentes en `package-lock.json` en vez de regenerarlas.
25+
26+
- Arrancamos la aplicación:
2527

2628
```bash
2729
ng serve
@@ -156,7 +158,7 @@ export class HighlightDirective {
156158

157159
De esta forma, tendremos en la variable _el_ una referencia al elemento th en el caso del listado de usuarios y una referencia al elemento p en el caso del menú.
158160

159-
ElementRef tiene una única propiedad, _nativeElement_, que nos da acceso al elemento en sí. A través de nativeElement podemos acceder y modificar cualquier atributo de elemento en cuestión.
161+
`ElementRef` tiene una única propiedad, _nativeElement_, que nos da acceso al elemento en sí. A través de _nativeElement_ podemos acceder y modificar cualquier atributo de elemento en cuestión.
160162

161163
Vamos a modificar el valor de `style.backgroundColor`:
162164

@@ -179,7 +181,7 @@ export class HighlightDirective {
179181
}
180182
```
181183

182-
Si miramos el navegador veremos que Angular a cambiado el valor de style.backgroundColor a todos los elementos que tengan el atributo _appHighlight_.
184+
Si miramos el navegador veremos que Angular a cambiado el valor de `style.backgroundColor` a todos los elementos que tengan el atributo _appHighlight_.
183185

184186
- Modificar la directiva para que solamente se resalte cuando pongamos el ratón encima del elemento
185187

@@ -343,7 +345,7 @@ export class HighlightDirective {
343345

344346
- color = 'lightblue';
345347
+ @Input()
346-
+ public color;
348+
+ public color!: string;
347349

348350
constructor(private el: ElementRef) { }
349351

@@ -365,7 +367,7 @@ export class HighlightDirective {
365367
}
366368
```
367369

368-
Este decorador @Input hace que los elementos afectados por appHighlight dispongan de un nuevo atributo, llamado _color_ (mismo nombre que la propiedad decorada con @Input). El valor del atributo color en el html se establecerá como valor de la propiedad en la directiva.
370+
Este decorador `@Input` hace que los elementos afectados por `appHighlight` dispongan de un nuevo atributo, llamado _color_ (mismo nombre que la propiedad decorada con `@Input`). El valor del atributo color en el html se establecerá como valor de la propiedad en la directiva.
369371

370372
_src/app/user/user-list/user-list.component.html_
371373

@@ -419,7 +421,7 @@ Con un poco de javascript podemos elegir un color por defecto en caso de que no
419421
export class HighlightDirective {
420422

421423
@Input()
422-
public color;
424+
public color!: string;
423425

424426
+ private defaultColor = 'lightblue';
425427

@@ -454,6 +456,27 @@ _src/app/layout/menu/menu.component.html_
454456
+ <p appHighlight [color]="variableColorEnElTS">menu works!</p>
455457
```
456458

459+
_src/app/layout/menu/menu.component.ts_
460+
461+
```ts
462+
import { Component } from '@angular/core';
463+
import { HighlightDirective } from '../../directives/highlight.directive';
464+
465+
@Component({
466+
selector: 'app-menu',
467+
standalone: true,
468+
imports: [HighlightDirective],
469+
templateUrl: './menu.component.html',
470+
styleUrl: './menu.component.css',
471+
})
472+
export class MenuComponent {
473+
/*diff*/
474+
public variableColorEnElTS = 'pink';
475+
/*diff*/
476+
}
477+
478+
```
479+
457480
Así hacemos que sea el typescript del componente el que decida cuál es el color con el que la directiva debe resaltar el elemento.
458481

459482
- Aprovechar el propio atributo de la directiva como `@Input` para el color.
@@ -462,15 +485,17 @@ El decorador `@Input` permite realizar la asociación aunque los nombres del atr
462485

463486
_src/app/layout/menu/menu.component.html_
464487

465-
```html
466-
<p appHighlight colorResaltado="green">menu works!</p>
488+
```diff
489+
-<p appHighlight color="green">menu works!</p>
490+
-<p appHighlight [color]="variableColorEnElTS">menu works!</p>
491+
+<p appHighlight colorResaltado="green">menu works!</p>
467492
```
468493

469494
```diff
470495
export class HighlightDirective {
471496

472497
+ @Input('colorResaltado')
473-
private color;
498+
public color!: string;
474499
```
475500

476501
Esto se suele utilizar para aprovechar el propio atributo `appHighlight` para pasar uno de los parámetros que tengamos con @Input.
@@ -515,4 +540,3 @@ export class HighlightDirective {
515540

516541
}
517542
```
518-

04-frameworks/02-angular/04-template-forms/readme_es.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Vamos a crear un formulario para añadir miembros a la lista.
99
Qué vamos a aprender en este ejemplo:
1010

1111
- Formularios template-driven
12-
- La directiva ngModel
12+
- La directiva `ngModel`
1313
- Directivas de atributo para validaciones
1414
- Variables de plantilla
1515
- Resaltar con CSS los campos no válidos
@@ -25,7 +25,9 @@ Pasos:
2525
npm install
2626
```
2727

28-
- Encendemos la aplicación:
28+
> NOTA: Podemos usar `npm ci` de esta forma instalaremos las dependencias existentes en `package-lock.json` en vez de regenerarlas.
29+
30+
- Arrancamos la aplicación:
2931

3032
```bash
3133
ng serve
@@ -217,7 +219,7 @@ _src/app/user/user-list/user-list.component.html_
217219
<div>
218220
<label>Name </label>
219221
- <input name="name" [(ngModel)]="newMember.login"/>
220-
+ <input name="name" [(ngModel)]="newMember.login" required minLength="6"/>
222+
+ <input name="name" [(ngModel)]="newMember.login" required minlength="6"/>
221223
</div>
222224
<div>
223225
<label>Avatar </label>
@@ -228,7 +230,7 @@ _src/app/user/user-list/user-list.component.html_
228230
</div>
229231
```
230232

231-
- Aprovechamos las clases ng-xxxxx que pone ngModel a los input para dar estilos CSS según el estado de validez de los campos
233+
- Aprovechamos las clases `ng-xxxxx` que pone `ngModel` a los input para dar estilos CSS según el estado de validez de los campos
232234

233235
_src/app/user/user-list/user-list.component.css_
234236

@@ -295,7 +297,7 @@ _src/app/user/user-list/user-list.component.html_
295297
</div>
296298
```
297299

298-
- Utilizamos otra variable de plantilla (esta vez extendida de la clase `ngForm`) para deshabilitar el botón si algún campo no es válido:
300+
- Utilizamos otra variable de plantilla (esta vez extendida de la directiva `ngForm`) para deshabilitar el botón si algún campo no es válido:
299301

300302
_src/app/user/user-list/user-list.component.html_
301303

04-frameworks/02-angular/05-pipes/readme_es.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ Pasos:
2222
npm install
2323
```
2424

25-
- Encendemos la aplicación:
25+
> NOTA: Podemos usar `npm ci` de esta forma instalaremos las dependencias existentes en `package-lock.json` en vez de regenerarlas.
26+
27+
- Arrancamos la aplicación:
2628

2729
```bash
2830
ng serve
@@ -70,7 +72,7 @@ ng generate pipe pipes/search-by-login
7072

7173
- Programamos la pipe
7274

73-
La función transform de la pipe recibirá la lista de miembros sobre la que realizar la búsqueda y el valor por el que buscar. Devolverá una lista con los miembros cuyo campo contenga el valor buscado.
75+
La función `transform` de la pipe recibirá la lista de miembros sobre la que realizar la búsqueda y el valor por el que buscar. Devolverá una lista con los miembros cuyo campo contenga el valor buscado.
7476

7577
_src/app/pipes/search-by-login.pipe.ts_
7678

@@ -156,7 +158,7 @@ _src/app/user/user-list/user-list.component.html_
156158

157159
Pero no ocurre nada, no está filtrando. Angular no encuentra motivo para revisar el html (que es cuando ejecutaría la pipe).
158160

159-
- Nos bindeamos al evento que nos interese de la caja de búsqueda, para que cuando ocurra el evento Angular revise el html y se ejecute la pipe.
161+
- Nos enlazamos al evento que nos interese de la caja de búsqueda, para que cuando ocurra el evento Angular revise el html y se ejecute la pipe.
160162

161163
_src/app/user/user-list/user-list.component.html_
162164

04-frameworks/02-angular/06-services/readme_es.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ Pasos:
2121
npm install
2222
```
2323

24-
- Encendemos la aplicación:
24+
> NOTA: Podemos usar `npm ci` de esta forma instalaremos las dependencias existentes en `package-lock.json` en vez de regenerarlas.
25+
26+
- Arrancamos la aplicación:
2527

2628
```bash
2729
ng serve

0 commit comments

Comments
 (0)