Demo de Aplicación Angular para Gestión de Películas
Resumen
¿Cómo comenzar con Angular?
Angular es un framework poderoso ideal para aplicaciones grandes gracias a su arquitectura avanzada. Aunque ahora trabajaremos con un demo pequeño, es útil imaginar que Angular será la opción predilecta para escalar nuestra aplicación. Vamos a replicar una pequeña demo similar a la realizada con React en Sandbox, ahora implementada con Angular.
¿Cómo configurar un nuevo proyecto?
Crear un nuevo Sandbox Angular: Volvemos a Home & Code Sandbox y seleccionamos Angular para un nuevo entorno de desarrollo.
Explorar dependencias: Al abrir el package.json, notamos múltiples dependencias que comienzan con Angular, junto con herramientas como RxJS. Estas hacen parte del mismo framework pese a estar divididas para manejos individuales.
Interfaz y componentes: En index.html, encontramos la etiqueta <ap-root>, específica de Angular. Este marcador integra los componentes compilados con técnicas como Angular ID y el DOM incremental, al tiempo que evita que los usuarios vean etiquetas inexistentes en HTML al compilar.
Configuración del componente principal
En Angular, los módulos encapsulan componentes y servicios. Nos concentraremos inicialmente en el componente o el módulo de aplicación (app.module.ts). A través de main.ts, proyectamos nuestro primer módulo utilizando platformBrowserDynamic.
¿Cómo manejar selectores y plantillas?
Manipulación del selector: En el app.component, el selector app-root inserta el componente en nuestros templates Angular.
Plantillas en Angular: Las plantillas HTML pueden escribirse directamente en el atributo template o referidas a un archivo HTML externo usando templateUrl.
¿Cómo iniciar el marcado de nuestra aplicación de películas?
Vamos a diseñar un componente básico que incluya la plantilla directamente. Definiremos un título y un formulario que exhibe las películas. Aunque al inicio usemos un formulario estático, más adelante emplearemos estructuras dinámicas.
HTML para componente inicial:
<h2>{{ title }}</h2><form><h3>Avengers</h3><buttontype="button">-</button><span>0</span><buttontype="button">+</button></form>
¿Cómo hacer dinámico nuestro template?
Gestión de datos en TypeScript
Debemos modificar app.component.ts para que variables y estructuras reflejen nuestros datos dinámicamente. Esto implica tipeo de datos gracias a TypeScript.
Título dinámico: Cambiaremos el title de estático a variable referenciada.
Array de películas: Definimos un array movies con objetos que contienen name y available.
Incorporando TypeScript para validaciones estrictas
Para aprovechar las características de TypeScript, definimos un tipo personalizado Movie para manejar las propiedades de nuestros objetos de película de manera clara y tipada.
Utilizamos un atributo especial en Angular, ngFor, para iterar dentro de nuestros elementos array, creando plantillas de películas dinámicamente.
<div*ngFor="let movie of movies"><h3>{{ movie.name }}</h3><buttontype="button"(click)="removeMovieQuantity(movie)">-</button><span>{{ movie.quantity }}</span><buttontype="button"(click)="addMovieQuantity(movie)">+</button></div>
Métodos para manipulación de cantidad
Desarrollaremos métodos específicos en app.component.ts permitiendo gestionar dinámicamente la propiedad quantity al interactuar con botones.
Te retamos a añadir atributos dinámicos que deshabiliten:
El botón de “menos” si movie.quantity es igual a cero.
El botón de “más” si movie.quantity es igual a movie.available.
Para lograrlo, sería beneficioso aplicar atributos envueltos entre corchetes angulares para indicar dependencias lógicas en los botones.
¡Ánimo! Continúa explorando y dominando Angular, preparando el camino para tu éxito como desarrollador web. Con cada desafío, te acercas más a ser un experto en la creación de aplicaciones escalables y dinámicas.
<h3>{{ title }}</h3><form *ngFor="let movie of movies"><h4>{{ movie.name}}</h4><button
type="button"[disabled]="movie.quantity <= 0"(click)="removeMovieQuantity(movie.name)">-</button>{{ movie.quantity}}<button
type="button"[disabled]="movie.quantity >= movie.available"(click)="addMovieQuantity(movie.name)">+</button></form>
para los que actualmente no les funciona el código, añadir :any
(movieName: any)
la mejor respuesta, ya iban como 2h viendo el video y viendo en que parte del código le erre lpm
Por fin, mil gracias!
Porque TypeScript es un lenguaje tipado?
TypeScript es un lenguaje tipado, pero es opcional. La razón por la cual Microsoft decidió hacerlo de esta forma, fue para evitar ciertos errores que pasaban muy frecuentemente con JavaScript, como el
undefined is not a function
Entonces, cuando el programador declara de manera explicita el tipo de dato de un elemento, estos errores son mas fáciles de detectar incluso desde el IDE
Vengo de la ruta de Frontend con React.js y me surge una duda... aunque me quiera enfocar por ahora en React.js, debería saber TypeScript? es decir saber esto influye en algo para react?
¡Hola! No, no influye para nada en React (aunque sí puedes usar React con TypeScript 👀), pero es opcional.
TypeScript es más para las personas a las que les gusta trabajar con lenguajes tipados y con JavaScript, digamos que es algo así como JavaScript, pero más estricto.
Esto es común verlo con personas que vienen de lenguajes como C# o Java, donde trabajas con tipos de datos, entonces ellos prefieren TypeScript, pero al final todo acaba compilándose a JavaScript, así que si ya estás cómoda usando JavaScript normalito con React y solo te quieres enfocar a React, pues continúa así :D
Eso sí, yo te invitaría a darle una mirada a TypeScript en algún momento, pero repito, no es obligatorio (para React) :D
Pienso lo mismo que el compañero, por experiencia he visto que como en las universidades enseñan lenguajes como java o C, a las personas les llega a parecer una pesadilla JavaScript porque no toleran no poder especificar de que tipo es cada variable jaja, pero sin duda no es necesario TypeScript en React JS
Angular se ve bastante complejo pero en lo personal me gusto su sintaxis por cierto aca dejo como quedaria el reto de los botones
Es algo así como la diferencia entre divs, sections y articles en HTML.
Yo personalmente te recomendaría usar type para funciones o métodos muy específicos, ya que es como crear tu propio tipo de dato.
El interface lo reservaría para definir la estructura de una clase y sus instancias, ya que es como un molde para que no se te olvide crear tus objeto-elementos con las reglas que necesites definir.
Este blogpost tiene una explicación más extendida: Types vs. interfaces in TypeScript.
<!--The content below is only a placeholder and can be replaced.--><div><h3>{{title}}</h3><form *ngFor="let movie of movies"><h4>{{movie.name}}</h4><button type="button"(click)="removeMovieQuantity(movie.name)"[disabled]="movie.quantity <= 0">-</button>{{ movie.quantity}}<button type="button"(click)="addMovieQuantity(movie.name)"[disabled]="movie.quantity >= movie.available">+</button></form></div>
Me pareció mucho más complejo Angular ya veo porque su popularidad baja más y más cada vez...
Por otro lado aquí está el reto solucionado:
<h3>{{title}}</h3><form *ngFor="let movie of movies"><h4>{{movie.name}}</h4><p>Available:</p><button
type="button"(click)="removeMovieQuantity(movie.name)"[disabled]="movie.quantity <= 0">-</button>{{movie.quantity}}<button
type="button"(click)="addMovieQuantity(movie.name)"[disabled]="movie.quantity >= movie.available">+</button></form>
<!--The content below is only a placeholder and can be replaced.--><div><h2>{{ title }}</h2><form *ngFor="let movie of movies"><h4>{{movie.name}}</h4><button
type="button"(click)="removeMovieQuantity(movie.name)"[disabled]="movie.quantity===0">-</button>{{movie.quantity}}<button
type="button"(click)="addMovieQuantity(movie.name)"[disabled]="movie.quantity===movie.available">+</button></form></div>
<h3>{{ title }}</h3><form *ngFor="let movie of movies"><h4>{{ movie.name}}</h4><button type="button"(click)="addMovieQuantity(movie.name)"[disabled]="movie.available <= movie.quantity">+</button>{{ movie.quantity}}<button type="button"(click)="removeMovieQuantity(movie.name)"[disabled]="0 >= movie.quantity">-</button></form>
Si les llega en estos tiempos a salir el error:
src/app/app.component.ts:30:20- error TS7006:Parameter'movieName' implicitly has an 'any' type.
Este error se debe a que TypeScript, el lenguaje de programación utilizado en Angular, está aplicando comprobaciones de tipo y requiere que se especifiquen los tipos de los parámetros de las funciones.
Para solucionar este error, puedes especificar explícitamente el tipo de 'movieName' como 'string' en la firma del método 'addMovieQuantity'.
I did the example. Angular is steady being the best option for me. Nevetherless I will say that I spend 40 minutes trying to make the button work, at the end I erase the buggy code, re write and then work.
Not only re think o re read your code. Be an active part of the develpment. Be greater