Apuntes de Angular
Apuntes de Angular
Contenido
Descarga e Instalación de Angular ........................................................................................................................ 3
Creación de Proyectos Angular ............................................................................................................................. 4
Resumen de Comandos ........................................................................................................................................ 5
Estructura de Angular ........................................................................................................................................... 6
Integrar Bootstrap con Angular ............................................................................................................................ 7
1. CDN en index.html ................................................................................................................................... 7
2. Localmente en carpeta assets vinculados en index.html ......................................................................... 7
3. Localmente en carpeta assets vinculados en angular.json ...................................................................... 7
4. Utilizando npm ......................................................................................................................................... 8
Componentes...................................................................................................................................................... 10
Crear componente .......................................................................................................................................... 10
Invocar componente ....................................................................................................................................... 11
Interpolación ................................................................................................................................................... 11
Properties Bynding.......................................................................................................................................... 12
Two way Binding (ngModel) ........................................................................................................................... 12
Directivas ........................................................................................................................................................ 13
Directivas estructurales .............................................................................................................................. 13
Servicios .............................................................................................................................................................. 14
Crear servicio .................................................................................................................................................. 14
Llamar Servicio desde componente ................................................................................................................ 14
1. Mediante atributo private en constructor ......................................................................................... 15
2. Creando fuera del constructor ........................................................................................................... 15
Observables y suscribe.................................................................................................................................... 16
Rutas ................................................................................................................................................................... 17
HttpCliente .......................................................................................................................................................... 19
Utilizando Casting ........................................................................................................................................... 19
Utilizando map ................................................................................................................................................ 19
Eventos HTML ..................................................................................................................................................... 21
REST con SpringBoot ........................................................................................................................................... 25
1. Configuración de dependencias en archivo POM.xml ........................................................................... 25
2. Configuración de archivo application.properties ................................................................................... 26
3. Entity: Creación de entidad clientes ....................................................................................................... 27
4. Creación de interfaz repositorio para clientes ....................................................................................... 28
5. Creación de interfaz de servicio para clientes........................................................................................ 28
6. Creación de clase que implemente la interfaz de servicio para clientes ............................................... 28
7. Creación de clase RestController para clientes ...................................................................................... 29
8. Creación de archivo DML: import.sql ..................................................................................................... 30
9. Prueba de servicio REST ......................................................................................................................... 30
10. Agregar métodos para crear, editar y elimina en interfaz de servicio para clientes ................................ 31
11. Agregar métodos para crear, editar y elimina en la clase de implementación de la interfaz de
servicio para clientes. ..................................................................................................................................... 31
12. Agregar métodos de crear, editar, eliminar en RestController.......................................................... 32
2
Descarga e Instalación de Angular
npm -v
node -v
2. Instalar Typescript
(Opcional dado que al instalar angular se agrega typescript, pero siempre es bueno tenerlo instalado de forma global)
tsc -v
3. Instalar angular
ng version
3
Creación de Proyectos Angular
para crear un proyecto usamos el comando
ng new project-name
iniciar el proyecto angular (Para detener el proyecto utilizamos la combinación Ctrl + C y aceptamos)
ng serve
Resultado:
Recomendaciones en VSCODE
Instalar el plugin de Angular Snippets para que auto complemente nuestro código
4
Resumen de Comandos
Crear proyecto Angular
ng new project-name
(project-name: nombre de proyecto)
Correr Servidor
ng serve [--open]
ng serve [-o]
(-o y --open permiten abrir el navegador)
Crear Componentes
ng g c componentName
Crear Servicios
ng g s serviceName
Crear Clases
ng g class className
5
Estructura de Angular
6
Integrar Bootstrap con Angular
1. CDN en index.html
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"src/styles.css",
"src/assets/css/bootstrap.min.css"
],
"scripts": [
"src/assets/js/jquery-3.5.1.slim.min.js",
"src/assets/js/popper.min.js",
"src/assets/js/bootstrap.min.js"
]
7
4. Utilizando npm
"assets": [
"src/favicon.ico",
"src/assets"
],
"styles": [
"src/styles.css",
"node_modules/bootstrap/dist/css/bootstrap.min.css"
],
"scripts": [
"node_modules/jquery/dist/jquery.slim.min.js",
"node_modules/popper.js/dist/umd/popper.min.js",
"node_modules/bootstrap/dist/js/bootstrap.min.js"
]
8
Integrar sweetalert2
https://sweetalert2.github.io/
swal.fire(
'Nuevo cliente',
`Cliente ${response.nombre} creado con éxito`,
'success'
);
9
Componentes
Crear componente
ng g c componentName
Al crear un componente se agregará a la carpeta app la carpeta del componente que se cree, en este caso se
creó el componente títulos.
@Component({
selector: 'app-titulos',
templateUrl: './titulos.component.html',
styleUrls: ['./titulos.component.scss']
})
Donde:
10
Invocar componente
Podemos invocar un componente mediante el nombre que se le dio al selector en el archivo
titulos.component.ts, por ejemplo:
<div>
<!-- Agregamos componente titulos-->
<app-titulos></app-titulos>
</div>
<router-outlet></router-outlet>
Interpolación
Podemos enviar variables a nuestro titulos.component.html desde el archivo de typescript
titulos.component.ts
11
Properties Bynding
Al cerrar en corchetes la propiedad de la etiqueta [], permite asignarle el valor de la variable enviada desde
ts. Ejemplo:
imagen:string =
"https://pbs.twimg.com/profile_images/1080739275338121216/kslMUNId_400x400.jpg";
Resultado:
Nota: podemos agregar nuestros estilos mediante el archivo .scss de nuestro componente:
img{
border-radius: 20px;
}
12
en el archivo .html ocupamos ngModel para poder recibir el valor de la variable, pero a la vez asignarle un
nuevo valor si se desea por medio del input
<p>
<input type="text" [(ngModel)]="input_value">
</p>
<p>{{input_value}}</p>
Resultado: al cambiar el texto en el input, se cambia el valor de la variable, y este se refleja en la etiqueta p
Directivas
Directivas estructurales
ngFor
/*TS*/
listaCurso: string[] = ['Typescript', 'Javascript', 'PHP', 'Java SE','CSS'];
ngIf
/*TS*/
enable: boolean = false;
13
Servicios
Crear servicio
ng g s serviceName
@Injectable(
{
providedIn: 'root'
}
)
@NgModule({
declarations: [],
imports: [],
providers: [
ClienteService
],
bootstrap: []
})
14
1. Mediante atributo private en constructor
import { Component, OnInit } from '@angular/core';
import { Cliente} from './cliente';
import { ClienteService } from './cliente.service';
@Component({
selector: 'app-cliente',
templateUrl: './cliente.component.html',
styleUrls: ['./cliente.component.css']
})
export class ClienteComponent implements OnInit {
/*Se inicializa la lista de clientes */
listaClientes: Cliente[];
ngOnInit(): void {
/*Se define la lista de clientes mediante el objeto de la clase de servicio*/
this.listaClientes = this.clienteService.getClientes();
}
}
@Component({
selector: 'app-cliente',
templateUrl: './cliente.component.html',
styleUrls: ['./cliente.component.css']
})
export class ClienteComponent implements OnInit {
/* Inicializando objeto de clase servicio y lista de clientes*/
clienteService : ClienteService;
listaClientes: Cliente[];
constructor(clienteService:ClienteService) {
/* Se define el objeto de la clase de servicio */
this.clienteService = clienteService;
15
}
ngOnInit(): void {
/*Se define la lista de clientes mediante el objeto de la clase de servicio*/
this.listaClientes = this.clienteService.getClientes();
}
}
Observables y suscribe
En el archivo clientes.service.ts
getClientes(): Observable<Cliente[]>{
return of(CLIENTE); // convertimos a un observable
}
En el archivo clientes.component.ts
ngOnInit(): void {
/*Se define la lista de clientes mediante el objeto de la clase de servicio
El método suscribe recibe como parametro una función anonima */
this.clienteService.getClientes().subscribe(
(clientes) =>{this.listaClientes = clientes}
);
}
16
Rutas
En el archivo app.module.ts
/* 1. Importación */
import { Routes, RouterModule } from '@angular/router';
/* 2. Definición de rutas */
export const routes: Routes = [
{ path:'', redirectTo:'/clientes', pathMatch: 'full' },
{ path: 'clientes', component: ClienteComponent },
{ path: 'directivas', component: DirectivaComponent }
];
@NgModule({
declarations: [],
imports: [
RouterModule.forRoot(routes) //3. Importación de las rutas mediante el modulo
],
providers: [],
bootstrap: []
})
<router-outlet></router-outlet>
En enlaces:
En button:
En el componente:
17
this.router.navigate(['/clientes'])
18
HttpCliente
Importamos módulo en app.module.ts
@NgModule({
declarations: [],
imports: [
HttpClientModule,
],
providers: [],
bootstrap: []
})
Utilizando Casting
@Injectable()
export class ClienteService {
getClientes(): Observable<Cliente[]>{
// Forma 1: Haciendo un casting dado que .get devuelve un observable<any[]>
return this.http.get<Cliente[]>(this.urlEndPoint);
}
}
Utilizando map
@Injectable
export class ClienteService {
19
private urlEndPoint:string = 'http://localhost:8080/api/clientes';
getClientes(): Observable<Cliente[]>{
// Forma 2: mediante map, con el que se logra realizar el casting dentro de
la promesa al tipo que deseamos, en este caso a la lista de clientes
return this.http.get(this.urlEndPoint).pipe(
map(response => response as Cliente[])
);
}
}
Nota: En el archivo de componente se debe utilizar suscribe de modo que se trabaje con asincronismo.
En el archivo clientes.component.ts
ngOnInit(): void {
/*Se define la lista de clientes mediante el objeto de la clase de servicio
El método suscribe recibe como parametro una función anonima */
this.clienteService.getClientes().subscribe(
(clientes) =>{this.listaClientes = clientes}
);
}
20
Form
Importamos FormsModule
@NgModule({
declarations: [],
imports: [ FormsModule ],
providers: [],
bootstrap: []
})
Crear
<form (ngSubmit)="create()">
<div class="row">
<div class="form-group col-md-6">
<label for="nombre">Nombre</label>
<input type="text" class="form-control" id="nombre"
name="nombre" placeholder="Pedro"
[(ngModel)]="cliente.nombre">
</div>
<div class="form-group col-md-6">
<label for="apellido">Apellido</label>
<input type="text" class="form-control" id="apellido"
name="apellido" placeholder="Infante"
[(ngModel)]="cliente.apellido">
</div>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="text" class="form-control" id="email"
name="email" placeholder="[email protected]"
[(ngModel)]="cliente.email">
</div>
<div class="form-group">
<button class="btn btn-primary" role="button">Crear</button>
</div>
</form>
21
Servicio de crear
@Injectable()
export class ClienteService {
Componente
@Component({
selector: 'app-form',
templateUrl: './form.component.html',
styleUrls: ['./form.component.css']
})
export class FormComponent implements OnInit {
22
ngOnInit(): void {
}
23
Eventos HTML
Los eventos son una forma de llamar a una función por medio de alguna acción por ejemplo un botón se ejecuta
el evento click:
focus: al interactuar con input y presionarlo para empezar a escribir, este evento es lanzado
24
REST con SpringBoot
25
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring.datasource.url=jdbc:mysql://localhost:3306/db_springboot_backend
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL57Dialect
spring.jpa.hibernate.ddl-auto=create
#Permite mostrar consultas nativas que se generan por debajo
logging.level.org.hibernate.SQL=debug
26
3. Entity: Creación de entidad clientes
package com.bolsadeideas.springboot.backend.apirest.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name="clientes")
public class Cliente implements Serializable{
// ID Serializable
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long id;
@Column(name = "nombre")
String nombre;
@Column(name = "apellido")
String apellido;
@Column(name = "email")
String email;
@Column(name = "create_at")
@Temporal(TemporalType.DATE)
Date createAt;
...
}
27
4. Creación de interfaz repositorio para clientes
package com.bolsadeideas.springboot.backend.apirest.dao;
import org.springframework.data.repository.CrudRepository;
import com.bolsadeideas.springboot.backend.apirest.entity.Cliente;
package com.bolsadeideas.springboot.backend.apirest.service;
import java.util.List;
import com.bolsadeideas.springboot.backend.apirest.entity.Cliente;
package com.bolsadeideas.springboot.backend.apirest.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.bolsadeideas.springboot.backend.apirest.dao.IClienteDAO;
import com.bolsadeideas.springboot.backend.apirest.entity.Cliente;
import com.bolsadeideas.springboot.backend.apirest.service.IClienteService;
@Service("clienteService")
public class ClienteServiceImpl implements IClienteService{
28
@Autowired
private IClienteDAO clienteDao;
@Override
@Transactional(readOnly = true) //Se esespecifica de forma explicita
public List<Cliente> findAll(){
return (List<Cliente>) clienteDao.findAll();
}
}
package com.bolsadeideas.springboot.backend.apirest.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.bolsadeideas.springboot.backend.apirest.entity.Cliente;
import com.bolsadeideas.springboot.backend.apirest.service.IClienteService;
@CrossOrigin(origins = {"http://localhost:4200"})
@RestController
@RequestMapping("/api")
public class ClienteRestController {
@Autowired
private IClienteService clienteService;
@GetMapping("/clientes")
public List<Cliente> index(){
return clienteService.findAll();
}
}
29
8. Creación de archivo DML: import.sql
30
10. Agregar métodos para crear, editar y elimina en interfaz de
servicio para clientes
package com.bolsadeideas.springboot.backend.apirest.service;
import java.util.List;
import com.bolsadeideas.springboot.backend.apirest.entity.Cliente;
package com.bolsadeideas.springboot.backend.apirest.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.bolsadeideas.springboot.backend.apirest.dao.IClienteDAO;
import com.bolsadeideas.springboot.backend.apirest.entity.Cliente;
import com.bolsadeideas.springboot.backend.apirest.service.IClienteService;
@Service("clienteService")
public class ClienteServiceImpl implements IClienteService{
@Autowired
private IClienteDAO clienteDao;
31
@Override
@Transactional(readOnly = true) //Se especifica de forma explicita
public List<Cliente> findAll() {
return (List<Cliente>) clienteDao.findAll();
}
@Override
@Transactional(readOnly = true) //Se especifica de forma explicita
public Cliente findById(long id) {
return clienteDao.findById(id).orElse(null); // Si no existe devolverá nu
ll
}
@Override
@Transactional // Se especifica que se pueden realizar todas operaciones
public Cliente save(Cliente cliente) {
return clienteDao.save(cliente);
}
@Override
@Transactional // Se especifica que se pueden realizar todas operaciones
public void delete(long id) {
clienteDao.deleteById(id);
}
}
@GetMapping("/clientes/{id}")
public Cliente show(@PathVariable long id) {
return clienteService.findById(id);
}
32
* @ResponseStatus(HttpStatus.CREATED): Devolvera el codigo 201, de creacion
* @RequestBody Cliente cliente: Spring recibirá el json y lo mapeará como un
objeto cliente
* */
@PostMapping("/clientes")
@ResponseStatus(HttpStatus.CREATED)
public Cliente create(@RequestBody Cliente cliente) {
return clienteService.save(cliente);
}
@PutMapping("/clientes/{id}")
@ResponseStatus(HttpStatus.CREATED)
public Cliente update(@RequestBody Cliente cliente, @PathVariable long id) {
/**/
Cliente clienteActual = clienteService.findById(id);
clienteActual.setNombre(cliente.getNombre());
clienteActual.setApellido(cliente.getApellido());
clienteActual.setEmail(cliente.getEmail());
/**/
return clienteService.save(clienteActual);
}
33