Eliseo Ávila
Juan Esteban Mazo Herrera
Erasmo Hernández
ProfesorJimmy Buriticá Londoño
Alexandro Jiménez
Fernando Robles
Reinaldo Mendoza
Santiago Lopera Naranjo
Reinaldo Mendoza
Jhonatan Segura
Leonardo Claro
Cesar Elías Armendariz Ruano
José Joel Farroñan Saca
Marisol Cervantes
Fernando Molano Castrillón
Jhan Ronaldo Antezana Yana
José Mauricio Lemus Rodezno
Cesar Augusto Silva Ruiz
ELKIN YESID MORENO VELEZ
Jairo Humberto Rey Castro
Oscar Ramos
Lorena Urrea
Saul Mamani
Camilo Bernal
Gilberto Espinoza Maciel
Binder Germán Ariel
Alexander De Jesús Ventura Mejía
Huilén Solís
Eligreg López
Jesús Alberto Camargo Pérez
Sebastian Arrieta Villarreal
Esta super
Angular siempre me pareció difícil, pero Nicolás lo explica de una manera digerible que se entiende todo super sencillo.
Tienes razón, yo venia aplazando el aprender Angular, pero ahora que me veo obligado por mi trabajo, tuve la suerte de tomar este curso en Platzi con un gran profesor.
Tienes mucha razón igual me pasó lo mismo, pero este curso me enseñó las bases que veía difícil en 3 horas.
Hasta ahora genial el curso. Me agrada mucho como explica Nico.
El mejor
Wow, terminando este modulo, me doy cuenta que Angular tiene super poderes, nos facilita mucho en cuanto a validaciones de entrada de texto, bloqueos de elementos en el dom, y todo esto con puros metodos/propiedades ya insertadas en Angular.
Esta muy muy bien hecho
Me demoré 30 minutos para compartir mi aporte 😅
Genial
<h1 class="form-title">Formulario</h2> <form class="form" (ngSubmit)="onRegister()" #myForm="ngForm"> <div></div> <div class="input-group"> <label class="form-label" for="Nombre">Nombre</label> <input class="form-input" type="text" name="name" required id="name" #nameInput="ngModel" [(ngModel)]="register.name" placeholder="Cesar"> <p class="message--error" [class.invalid]="nameInput.invalid">Campo requerido</p> </div> <div></div> <div></div> <div class="input-group"> <label class="form-label" for="Email">Email</label> <input class="form-input" type="email" name="email" required id="email" #emailInput="ngModel" [(ngModel)]="register.email"> <p class="message--error" [class.invalid]="emailInput.invalid">Campo requerido</p> </div> <div></div> <div></div> <div class="input-group"> <label class="form-label" for="password">Password</label> <input class="form-input" type="password" name="password" required id="password" #passwordInput="ngModel" [(ngModel)]="register.password"> <p class="message--error" [class.invalid]="passwordInput.invalid">Campo requerido</p> </div> <div></div> <div></div> <div class="form-buttons"> <button class="buttonSubmit" [disabled]="myForm.invalid" type="submit">Registrar</button> <button class="buttonAction" type="button">Accion</button> </div> </form>
.form-title { display: flex; justify-content: center; color: darkgreen; font-size: 2.4rem; font-family: cursive; padding-bottom: 2rem; } .form { display: grid; grid-template-columns: 40px minmax(345px, 530px) 40px; grid-template-rows: repeat(5, auto); } .input-group { display: grid; justify-items: stretch; padding-bottom: 30px; .form-label { font-family: cursive; padding-bottom: 5px; } .form-input { width: 100%; padding: 12px 20px; margin: 8px 0; box-sizing: border-box; border: 1.3px solid darkgreen; border-radius: 10px; } } .form-buttons { display: flex; margin: 10px; padding-bottom: 30px; justify-content: space-evenly; .buttonSubmit { font-size:15px; font-family:Arial; width:140px; height:50px; border-width:1px; color:#fff; border-color:#599bb3; font-weight:bold; border-top-left-radius:8px; border-top-right-radius:8px; border-bottom-left-radius:8px; border-bottom-right-radius:8px; box-shadow: 0px 10px 14px -7px #276873; text-shadow: 0px 1px 0px #3d768a; background:linear-gradient(#599bb3, #408c99); } .buttonSubmit:disabled { background: linear-gradient(27deg, rgba(0,0,0,1) 0%, rgba(195,190,183,1) 100%); background-color:transparent; } .buttonSubmit:hover { background: linear-gradient(#408c99, #599bb3); } .buttonAction { font-size:15px; font-family:Arial; width:140px; height:50px; border-width:1px; color:rgba(255, 255, 255, 1); border-color:#599bb3; font-weight:bold; border-top-left-radius:8px; border-top-right-radius:8px; border-bottom-left-radius:8px; border-bottom-right-radius:8px; box-shadow: 0px 10px 14px -7px #276873; text-shadow: 0px 1px 0px #3d768a; background:linear-gradient(rgba(121, 214, 217, 1), rgba(52, 198, 187, 1)); } .buttonAction:hover { background: linear-gradient(rgba(52, 198, 187, 1), rgba(121, 214, 217, 1)); } } .message--error { background-color: red; color: white; opacity: 0; transition: all linear .2s; &.invalid { opacity: 1; } } @media screen and (min-width: 400px) { .form { justify-content: center; } }
Agregale un patter a tu correo ^[\w-.]+@([\w-]+.)+[\w-]{2,4}$
Les comparto mi formulario https://angular-ivy-w9gqgv.stackblitz.io
Y aquí el código: HTML
<div class="form-container"> <h2>My Account</h2> <form (ngSubmit)="onRegister()" #myForm="ngForm"> <div class="input-group"> <label for="name">Name</label> <input type="text" id="name" required [(ngModel)]="register.name" name="name" /> <p class="form-error-msg" [ngClass]="{ valid: register.name !== '', invalid: register.name === '' }" > Invalid or no data entered </p> <label for="email">Email</label> <input type="email" id="email" required [(ngModel)]="register.email" name="email" /> <p class="form-error-msg" [ngClass]="{ valid: register.email !== '', invalid: register.email === '' }" > Invalid or no data entered </p> <label for="password">Password</label> <input type="password" id="password" required [(ngModel)]="register.password" name="password" /> <p class="form-error-msg" [ngClass]="{ valid: register.password !== '', invalid: register.password === '' }" > Invalid or no data entered </p> </div> <button type="submit" [disabled]="myForm.invalid" [class.invalid]="myForm.invalid" > Register </button> </form> </div>
CSS
.form-container { margin: 0; padding: 0; box-sizing: border-box; width: 100vw; height: 100vh; background-color: white; display: grid; place-content: center; font-family: "Roboto", "Open Sans", "Helvetica Neue", sans-serif; font-size: 14px; & h1 { margin-bottom: 40px; font-size: 16px; } } form { width: 300px; } .input-group { display: flex; flex-direction: column; & label { margin-bottom: 4px; font-weight: 600; } & input { border: none; outline: none; height: 24px; border-radius: 10px; padding: 4px 8px; background-color: whitesmoke; caret-color: green; color: rgb(98, 97, 97); } } button[type="submit"] { background-color: rgb(75, 161, 108); padding: 16px 24px; width: 100%; border-radius: 10px; color: white; font-weight: 700; border: none; outline: none; cursor: pointer; &.invalid { background-color: rgb(170, 208, 185); } } .form-error-msg { font-size: 12px; color: red; &.valid { opacity: 0; } &.invalid { opacity: 1; } }
Si queremos validar los campos del formulario una vez se han enviado o se ha interactuado con ellos podemos hacer lo siguiente:
Primero agregamos una template variable a nuestro formulario
<form class="form" #registerForm="ngForm" (ngSubmit)="onSubmit(registerForm)"> </form>
Como se ha visto en clases agregamos una almohadilla o numeral y le asignamos un nombre luego le indicamos que será un ngForm. Una vez tenemos esto podemos validar los campos del formulario de la siguiente manera:
<div class="form-control"> <input placeholder="Email" type="email" name="email" required [(ngModel)]="register.email" /> <span class="helper-text" [class.visible]=" (registerForm.submitted || registerForm.controls['email']?.touched) && registerForm.controls['email'].invalid " > Error el campo email es requerido </span> </div>
Lo que hacemos aquí es agregar una clase visible al span que contiene la clase helper-text basado en la condición de que el usuario ha enviado el formulario o ya interactuó con el y además el campo es invalido. Si quieren saber mas del funcionamiento de NgForm les recomiendo la documentación también les dejo la documentación de los controles del formulario.
El formulario completo quedaría de la siguiente forma:
<form class="form" #registerForm="ngForm" (ngSubmit)="onSubmit(registerForm)"> <div class="form-control"> <input placeholder="Email" type="email" name="email" required [(ngModel)]="register.email" /> <span class="helper-text" [class.visible]=" (registerForm.submitted || registerForm.controls['email']?.touched) && registerForm.controls['email'].invalid " > Error el campo email es requerido </span> </div> <div class="form-control"> <input placeholder="Password" type="password" name="password" required [(ngModel)]="register.password" /> <span class="helper-text" [class.visible]=" (registerForm.submitted || registerForm.controls['password']?.touched) && registerForm.controls['password'].invalid " > Error el campo password es requerido </span> </div> <button type="submit">Register</button> </form>
Es poquito pero es trabajo honesto 😊 https://angular-ivy-dhnggy.stackblitz.io/
¿ Cuando hablan de trabajo honesto a que se refieren ?
De lo contrario un código que hayas realizado por ti mismo personalmente pienso que no tiene nada que ver con la honestidad a no ser que los codificadores o programadores de hoy en día antes de hacer el código por si mismos sean deshonestos y acudan a los tres puntos que ya he mencionado con anterioridad.
De donde sacaste la imagen del fondo? Esta hermosaaa
algo que no veo que mencionen es que los inputs tienen un validador para el email un poco mejor y es usando el atributo
pattern="^[^@]+@[^@]+\.[a-zA-Z]{2,}$"
podriamos usar esa aexpresion regular para validar el formato de email. ya que como queda finalmente el formulario, puedes poner una letra y ya es valido, con esto obliga al usuario a poner un email de forma correcta
Explicas muy bien, solo te falta orden. Es bueno borrar clases anteriores en el código, para no confundir.

Pequeño aporte: Con todo lo aprendido ya podemos crear un formulario sencillo de registro y hacer algunas validaciones. Lo primero sería crear el modelo de datos que se van a registrar en nuestro controlador
Si te sale el error Can't bind to 'ngModel' since it isn't a known property of 'input', agrega en el app.module.ts el Forms Module
import { FormsModule } from '@angular/forms'; [...] @NgModule({ imports: [ [...] FormsModule ], [...] })
Me salía el mismo error y al anexarlo sigue saliendo error
Asegúrate de haber colocado ese import en el archivo app.module.ts. Se puede confundir con el otro archivo app-routing.module.ts.