Sebastián Buitrago
Array con la informacion de las peliculas
[ { name: "Avengers", available: 3, quantity: 0, }, { name: "Terminator", available: 5, quantity: 0, }, ]
Ricardo Mazuera
Gracias
Josue Cerron Tuesta
Gracias bro!
¿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?
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.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?
app.component, el selector app-root inserta el componente en nuestros templates Angular.template o referidas a un archivo HTML externo usando templateUrl.@Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] })
¿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.
<h2>{{ title }}</h2> <form> <h3>Avengers</h3> <button type="button">-</button> <span>0</span> <button type="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.
title de estático a variable referenciada.movies con objetos que contienen name y available.export class AppComponent { title: string = 'Películas'; movies: { name: string; available: number; }[] = [ { name: 'Avengers', available: 5 }, { name: 'Terminator', available: 3 } ]; }
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.
type Movie = { name: string; available: number; quantity: number; }; export class AppComponent { movies: Movie[] = [ { name: 'Avengers', available: 5, quantity: 0 }, { name: 'Terminator', available: 3, quantity: 0 } ]; }
¿Cómo iterar componentes de películas?
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> <button type="button" (click)="removeMovieQuantity(movie)">-</button> <span>{{ movie.quantity }}</span> <button type="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.
addMovieQuantity(movie: Movie): void { const movieIndex = this.movies.findIndex(m => m.name === movie.name); this.movies[movieIndex].quantity += 1; } removeMovieQuantity(movie: Movie): void { const movieIndex = this.movies.findIndex(m => m.name === movie.name); this.movies[movieIndex].quantity -= 1; }
Desafío: Habilitar y deshabilitar botones
Te retamos a añadir atributos dinámicos que deshabiliten:
movie.quantity es igual a cero.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.
Así quedaría el código con el reto
<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>
Sebastián Buitrago
Array con la informacion de las peliculas
[ { name: "Avengers", available: 3, quantity: 0, }, { name: "Terminator", available: 5, quantity: 0, }, ]
Ricardo Mazuera
Gracias
Josue Cerron Tuesta
Gracias bro!
César Palma
Personalmente prefiero la sintaxis de angular, react es una pesadilla visual
Elvis Saavedra
Se puede usar react con typescript, al igual vue tiene js y ts
Moisés Jahaziel Luna Chagollán
Yo vengo de React y pienso lo mismo a la inversa 😂
Miguel Angel Berrio Huamani
Julian David Alzate Cuervo
para los que actualmente no les funciona el código, añadir :any
(movieName: any)
Rodrigo Damián Martinez
la mejor respuesta, ya iban como 2h viendo el video y viendo en que parte del código le erre lpm
Wilmer Conde Gómez
Por fin, mil gracias!
Irving Juárez
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
Paula Fernanda Silva Pinzón
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?
Carlos Eduardo Gomez García
¡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
Bryan Aranda
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
Víctor Isaac Arias García
Angular se ve bastante complejo pero en lo personal me gusto su sintaxis por cierto aca dejo como quedaria el reto de los botones
<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>
Anfernee Valera
Me gusta que Angular sea con typescript, but a la vez siento que se me complica más su sintaxis xD
Christian Alvarenga
¿Alguien sabe a qué se debe este error?
David Pedroza Segoviano
Sip, probablemente le pusiste como tipo Number a quantity, solo cámbiale el nombre a number y eso debería de resolverlo
Carlos Rubén Díaz Gutiérrez
Que pesadilla TypeScript, demasiada cosa. 😵💫
Jaime Ortiz
Qué diferencia hay entre "type" e "interface" de typescript?
//type type Movie = { name: String, available: Number } interface Movie = { name: String, available: Number }
Juan Castro
ProfesorEs muy poco confuso al principio, debo admitir.
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.
Kevin Figuera
Cristian David Casallas Velandia
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>
Max Andy Diaz Neyra
Orangel Gonzalez
Reto:
<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>
Francisco Horacio Arenas Massa
my code
Use lo que corresponde al [disabled]
<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>
Donovan RM
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'.
addMovieQuantity(movieName: string) { const movieIndex = this.movies.findIndex( (movie) => movie.name === movieName ); this.movies[movieIndex].quantity += 1; }
Gilberto Espinoza Maciel
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
Love always community
Mi solución al reto
App.component.html
<h3>{{title}}</h3> <form *ngFor="let movie of movies"> <h4>{{movie.name}}</h4> <img src="{{movie.url}}" width="100px" alt="" /> <br /> <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>
App.component.ts
import { Component } from "@angular/core"; type Movie = { name: String; available: Number; quantity: any; url: String; }; type Movies = Array<Movie>; @Component({ selector: "app-root", templateUrl: "./app.component.html", styleUrls: ["./app.component.css"] }) export class AppComponent { title: String = "Peliculas"; movies: Movies = [ { name: "Avengers", available: 3, quantity: 0, url: "https://dam.smashmexico.com.mx/wp-content/uploads/2018/04/24160210/lo-que-debes-recordar-avengers-infinity-war.jpg" }, { name: "Terminator", available: 5, quantity: 0, url: "https://es.web.img3.acsta.net/pictures/16/02/12/15/14/218373.jpg", } ]; addMovieQuantity(movieName) { const movieIndex = this.movies.findIndex( (movie) => movie.name === movieName ); this.movies[movieIndex].quantity += 1); } removeMovieQuantity(movieName) { const movieIndex = this.movies.findIndex( (movie) => movie.name === movieName ); this.movies[movieIndex].quantity -= 1; } }
app.component.ts
import { Component } from "@angular/core"; type Movie = { name: string, available: number, quantity: number, }; type Movies = Array<Movie>; @Component({ selector: "app-root", templateUrl: "./app.component.html", styleUrls: ["./app.component.css"] }) export class AppComponent { title: String = "Películas"; movies: Movies = [ { name: 'Avengers', available: 3, quantity: 0, }, { name: 'Terminator', available: 5, quantity: 0, } ]; addMovieQuantity(movieName){ const movieIndex = this.movies.findIndex( movie => movie.name === movieName ); this.movies[movieIndex].quantity += 1; } removeMovieQuantity(movieName){ const movieIndex = this.movies.findIndex( movie => movie.name === movieName ); this.movies[movieIndex].quantity -= 1; } }
app.component.html
<!--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>
Codigo final de la clase:
import { Component } from "@angular/core"; type Movie = { name: String; available: Number; quantity: Number; }; type Movies = Array<Movie>; @Component({ selector: "app-root", templateUrl: "./app.component.html", styleUrls: ["./app.component.css"] }) export class AppComponent { title = "Películas"; movies: Movies = [ { name: "Avenger", available: 5, quantity: 0 }, { name: "Terminator", available: 3, quantity: 0 } ]; addMovieQuantity(movieName) { const movieIndex = this.movies.findIndex( (movie) => movie.name === movieName ); this.movies[movieIndex].quantity += 1; } removeMovieQuantity(movieName) { const movieIndex = this.movies.findIndex( (movie) => movie.name === movieName ); this.movies[movieIndex].quantity -= 1; } }
<!--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>