--- title: Comenzar con Angular --- {%hackmd hackmd-dark-theme %} ## Requisitos - Tener Nodejs =< v18.12.1 - Instalar el cli de angular: `npm i -g @angular/cli` - Corroborar que se instalo de forma global: `ng version` ## Extensiones recomendadas - [**Angular language service** (*Vs Code*)](https://marketplace.visualstudio.com/items?itemName=Angular.ng-template): nos permite comunicar nuestro proyecto con el ecosistema de angular. - **Angular DevTools** (*Chrome*): nos permite tener herramienta dentro del navegador para ver el arbol de componente, estados y más... ## Crear un nuevo proyecto La herramienta @angular/cli, nos permite crear un nuevo proyecto de la siguiente manera. **Crear un nuevo proyecto con nombre my-app** ``` ng new my-app ``` **Correr el proyecto** ```bash! npm run start # o también puede usar en su lugar: ng serve ``` ## Indagando en el proyecto **Estructura del proyecto** ``` 📂 my-app └───📂 src ├───📂 app └───📂 assets ``` **Características del componente** ```typescript= import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { title = 'My best APP!'; } ``` Podemos crear un método para cambiar el valor de `title`: ```typescript= import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { title = 'My best APP!'; // 👇 método que modificará el valor del título changeTitle(){ this.title = 'changed' } } ``` Una vez declarado el método, podemos ir al html y crear un botón que ejecute el método: ```htmlembedded= <h1>Hola {{ title }}</h1> <button (click)="changeTitle()">Cambiar</button> ``` ### Generar un nuevo componente ``` ng g c components/product ``` >- g => de generate >- c => de component >- components/product => ubicación y nombre del componente Una vez creado el componente, si está pensado apra ser un producto lo primero que deberíamos hacer es declarar los tipos que corresponde a el producto que recibirá nuestro componente, esto lo podemos hacer a través de ***intefaces***, siendo un poco más organizado podemos hacer una carpeta de modelos para almacenar esas intefaces. ```typescript= // app/models/product.model.ts interface Product { id: number; title: string; price: number; images: string[]; } ``` Añadir el componente, cada componente tiene un ***selector***, con el podemos incluir este componente en el DOM principal. ### Intercambiare valores entre componentes **Decorador @input** Para indicarle a un componente que puede recibir un valor desde el componente padre debemos agregarle el decorador `@input` a la propiedad que deseamos controlar. >Un input es análogo a lo que vendrían siendo los **props** en [React](https://es.react.dev/). Para comenzar, debemos importar esta clase y usarlo como decorador en la propiedad: ```typescript= import { Component, Input } from '@angular/core'; @Component({ selector: 'app-product', templateUrl: './product.component.html', styleUrls: ['./product.component.css'] }) export class ProductComponent { // 👇 decoramos 👇 inciar el valor por defecto @Input() title: string = 'productos'; } ``` Hecho esto podemos recibir el valor de la siguiente manera: ```htmlembedded <h1>Hola {{title }}</h1> <button (click)="changeTitle()">Cambiar</button> <app-product title="Productazos"></app-product> ``` Pero al final, hemos creado una interfaz para usar en este componente, asi haciendo el cambio, la siguiente es una forma de como recibir un producto declarado en la interface y darle los valores iniciales: ```typescript! import { Component, Input } from '@angular/core'; import { Product } from "../../models/product.model" @Component({ selector: 'app-product', templateUrl: './product.component.html', styleUrls: ['./product.component.css'] }) export class ProductComponent { @Input() product: Product = { title: '', price: 0, images: [], id: 0 }; } ``` Y la otra es usar una característica de **TypeScript**: ```typescript! import { Component, Input } from '@angular/core'; import { Product } from "../../models/product.model" @Component({ selector: 'app-product', templateUrl: './product.component.html', styleUrls: ['./product.component.css'] }) export class ProductComponent { // 👇 de esta forma no nos obligará a declararlo (usalo con cuidado) @Input() product!: Product; } ``` Ahora vamos al componente y ya no enviariamos un título, sino que un producto, que vamos a obtener desde una API. ```htmlembedded <h1>Hola {{title }}</h1> <button (click)="changeTitle()">Cambiar</button> <app-product title=""></app-product> ```