Inicio del curso

1

De qu茅 tratar谩 este curso sobre Angular 4

Introducci贸n a Angular 4

2

Versionamiento en Angular

3

驴Qu茅 es Angular? Versiones y ventajas

4

Typescript: qu茅 es

5

Introducci贸n al Proyecto: PlatziSquare!

Setup del Ambiente de Trabajo

6

Herramientas de trabajo y Angular CLI

7

Generaci贸n y estructura de Angular 4

8

RETO: Haz un cambio simple en el proyecto.

Conceptos B谩sicos

9

Para qu茅 nos sirven los M贸dulos y Componentes

10

Tipos de Data Binding y String Interpolation

11

Property Binding

12

Event Binding

13

Two Way Data Binding

14

Directivas en Angular 4 y ngFor

15

Directiva ngIf

16

Instalando librer铆as con NPM (Google Maps)

Directivas

17

Directivas ngStyle y ngClass

18

Directiva ngSwitch

19

Directiva de atributo

20

Host Listeners

21

Host Binders

Angular UI

22

Angular Material y Bootstrap

23

Configurando e implementando Bootstrap en nuestro proyecto

Ruteo

24

Qu茅 hace el router en Angular 4

25

Implementaci贸n de Rutas en el Proyecto

26

Diferencias entre href y routerLink

27

Resaltando el link activo con CSS para indicar visualmente en que componente nos encontramos

28

Par谩metros en Rutas

29

Par谩metros tipo Query

30

Creando una vista de detalle para el proyecto

31

Creando la p谩gina de contacto para PlatziSquare

Servicios

32

Qu茅 son los servicios en Angular 4

33

Creando nuestro propio servicio

34

Configurando Firebase en nuestro proyecto

35

Guardando Records en Firebase

36

Obteniendo records desde Firebase

37

Obteniendo coordenadas usando Geocoding

38

Reto: Crear una vista para editar records

39

Mostrando marcadores en el Mapa de Google

Conexi贸n Remota (Http y Sockets)

40

Funcionamiento de los llamados Http y Sockets

41

Qu茅 es una arquitectura cliente - servidor

42

Enviando llamados tipo POST

43

Enviando llamados tipo GET

44

Formateando respuestas del servidor con el operador map()

45

Manejando errores HTTP

Pipes

46

Utilidad de los Pipes en Angular 4

47

Usando los pipes por defecto de Angular

48

Par谩metros en pipes

49

Creando nuestro propio pipe

Animaciones en Angular

50

Configurando animaciones en nuestro proyecto

51

Transiciones

52

Callbacks

53

Soluci贸n al Reto: A帽adiendo animaciones a nuestra aplicaci贸n

Testing en Angular

54

Introducci贸n a unit tests

55

Configuraci贸n de testing por default

56

Corriendo los tests

57

Creando unit tests para componentes

58

Integraci贸n de Unit Test con Servicios

Autenticaci贸n y Protecci贸n de Rutas

59

C贸mo funcionan los JSON Web Tokens

60

Preparaci贸n de vistas para login y registro

61

Registrando usuarios

62

Loggeando usuarios

63

Protecci贸n de Rutas

64

Autenticaci贸n con redes sociales.

65

Logout

RxJS

66

Qu茅 es RxJS

67

Configurando RxJS en nuestro proyecto

68

Uso de los Observables

69

Implementando un TypeAhead

70

Implementando un TypeAhead 2

71

Soluci贸n al reto autocompletar los campos de direcci贸n usando observables

Publicando nuestro proyecto

72

Publicando en Firebase Hosting

Fin del curso

73

Conclusi贸n 驴Qu茅 aprendimos en el curso?

74

Reto final del curso - realiza un nuevo modulo de PlatziSquare de acuerdo con las historias de usuario

Sesiones en vivo

75

Creando un traser bullet de PlatziSquare

76

Sesi贸n de preguntas y respuestas

77

Release de Angular 5

78

Sesi贸n de preguntas y respuestas

79

Angular Universal

Contenido Bonus

80

Actualizaci贸n de angular, versi贸n 6.0

Disfruta de nuestro contenido y eventos por un a帽o a un precio especial

Antes: $179

Currency
$149/a帽o
隆Suscr铆bete!

馃敟 Te quedan 馃敟

1D
8H
12M
49S
Curso de Angular 4

Curso de Angular 4

Eduardo Ibarra

Eduardo Ibarra

Two Way Data Binding

13/80
Recursos

Two Way Data Binding engloba a los otros tipos de bindeo, es decir me permite hacer comunicaci贸n en dos v铆as.

Aportes 96

Preguntas 7

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

buenas clases

HTML
<input type=鈥渢ext鈥 placeholder=鈥淣ame鈥 [(ngModel)]= 鈥渘ame鈥>
<input type=鈥渢ext鈥 placeholder=鈥淟ast Name鈥 [(ngModel)]= 鈥渓astName鈥>
My name is: {{name + " "+ lastName}}

TS
name:String = 鈥樷;
lastName: String = 鈥樷;

Aqui va mi codigo!
<hr />
<input type=鈥渢ext鈥 placeholder=鈥淭u primer nombre鈥 [(ngModel)]=鈥渘ombre鈥 />
<br />
<hr />
<input type=鈥渢ext鈥 placeholder=鈥淭u segundo nombre鈥 [(ngModel)]=鈥渘ombre1鈥 />
<br />
Mis nombres son {{nombre}} {{nombre1}}

Saludos!

<input type="text" placeholder="Tu nombre" [(ngModel)]="nombre">
<br />
<input type="text" placeholder="Tu nombre" [(ngModel)]="nombre2">

Mi nombre es {{nombre}} {{nombre2}}```

Yo no quise andar haciendo m谩s variables, as铆 que hice una funci贸n y ah铆 concaten茅 los dos nombres

processName(){	
	alert(`${this.nombre} ${this.segundoNombre}`)
}

y al final s贸lo invoqu茅 a la funci贸n en el buttom as铆

<button [disabled]="!listo" (click)="processName()"> Touch me xd </button>

Un saludo!

Soluci贸n al desafi贸:

Hay alguna manera de usar con string interpolation el string template de es2016 de la siguiente manera:

{{ `${ nombre1 } ${ nombre2 }` }}

porque lo intente y no funciono y con vuejs si es posible

<input type="text" name="" value="" placeholder="Tu nombre" [(ngModel)]="nombre"/>
<input type="text" name="" value="" placeholder="Tu apellido" [(ngModel)]="apellido"/>
<br>
Mi nombre es {{nombre + ' ' + apellido}}```

  <input type="text" placeholder="tu nombre" [(ngModel)]="nombre">
  <hr>
  <input type="text" placeholder="Apellido" [(ngModel)]="Apellido">
  <hr>
  Mi nombre es {{nombre}} {{Apellido}}```

HTML

<div style="text-align:center">
  <h2>Two way data binding</h2>
  <input type="text" placeholder="Escribe tu nombre" [(ngModel)]="name" />
  <input type="text" placeholder="Escribe tu Apellido" [(ngModel)]="lastName" />
  <br />
  Mi nombre es {{name}} {{lastName}}
</div>

TypeScript

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  name:string = '';
  lastName:string = '';
}

app.component.html

  <input type = "text" placeholder="Nombre" [(ngModel)] = "nombre" /> &nbsp;
  <input type = "text" placeholder="Apellido" [(ngModel)] = "apellido" />
  <br>
  Mi nombre es: {{nombre}} {{apellido}}

Agregar la propiedad fuera del constructor:

 apellido:string = '';

Me da error en el import
adjunto imagen

cuando me pongo encima del error me sale lo siguiente
TSLint 鈥榮hould be鈥 (quotemark)
me podeis ayudar??

como se mete una imagen??

Le realize una para nombre y apellidos, es muy interesante.

<!--The content below is only a placeholder and can be replaced.-->
<div style="text-align: center">
  <h1>
    Bienvenido a {{ title }}!

  </h1>

  <hr />
  <button [disabled]="!listo" (click)="hacerAlgo()" >Click me !</button>
  <hr />
  <label>Nombres</label>
  <input type="text" placeholder="Nombre 1" [(ngModel)]="nombres"/>
  <label>Apellidos</label>
  <input type="text" placeholder="Nombre 2" [(ngModel)]="apellidos"/>
  <br />
  Mi nombre completo es: {{nombres+' '+apellidos}}


</div>

Interesante mi soluci贸n al ingresar nombre y apellidos.

<!--The content below is only a placeholder and can be replaced.-->
<div style="text-align: center">
  <h1>
    Bienvenido a {{ title }}!

  </h1>

  <hr />
  <button [disabled]="!listo" (click)="hacerAlgo()" >Click me !</button>
  <hr />
  <label>Nombres</label>
  <input type="text" placeholder="Nombre 1" [(ngModel)]="nombres"/>
  <label>Apellidos</label>
  <input type="text" placeholder="Nombre 2" [(ngModel)]="apellidos"/>
  <br />
  Mi nombre completo es: {{nombres+' '+apellidos}}


</div>
<div class="container">
  <button class="btn btn-primary" [disabled]="!listo" (click)="hacerClick()" >boton</button>
  <hr>
  <input type="text" name="" id="nombre" placeholder="Nombre"  [(ngModel)]="nombre">
  <br>
  <input type="text" name="" id="apellido" placeholder="Apellido"  [(ngModel)]="apellido">
  <br>
  <p>Mi nombre es {{ nombre }} <strong>{{apellido}}</strong></p>
</div>```
 
<div style="text-align:center">
  <h1>
    Welcome to {{ title }}!
  </h1>
  <h2>{{a+b}} </h2>
  <hr />
  <button [disabled]= "!listo" (click)="hacerAlgo()">CLICK隆隆隆</button>
  <hr />
  <input type="text" placeholder="Tu nombre" [(ngModel)]="nombre" />
  <input type="text" placeholder="apellido" [(ngModel)]="apellido" />
  Mi nombre es {{nombre}}
  Y mi apellido es {{apellido}}
</div>

Lo realizado

mi c贸digo

<hr>
<input type=鈥渢ext鈥 placeholder=鈥淎pellido鈥 [(ngModel)]=鈥淎pellido鈥 >
<br>
<i>Me presento soy </i> <b>{{Nombre}} {{Apellido}} </b>

TS

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'PlatziSquare';
  a = 3;
  b = 5;
  listo = false;
  nombre:string = "";
  nombreMascota:string = "";
  constructor(){
      setTimeout(() =>{
      this.listo = true;

      },3000 );
  }
  hacerAlgo(){
    alert('Haciendo Algo');
  }
}

Html

<div style="text-align:center">
  <h1>
    Bienvenido a {{ title }}!
  </h1>
<h2>
  {{a+b}}
</h2>
<hr />
<button [disabled] = "!listo" (click)= "hacerAlgo()" >Clic Me</button>
<hr />

<input type="text" placeholder="Tu nombre" [(ngModel)] = "nombre" />
<input type="text" placeholder="Nombre Mascota" [(ngModel)] = "nombreMascota" />

<br>
Tu nombre es {{nombre}} Y el nombre de tu mascota es {{nombreMascota}}
</div>

Primero cree mis par谩metros o variables y despu茅s agregue unas validaciones al evento del click en el componente del typescript:

import { Component } from 鈥淍angular/core鈥;

@Component({
selector: 鈥渁pp-root鈥,
templateUrl: 鈥./app.component.html鈥,
styleUrls: ["./app.component.css"],
})
export class AppComponent {
title = 鈥淧latziSquare鈥;
enable = true;
name: string = 鈥溾;
firstname: string = 鈥溾;
secondname: string = 鈥溾;
surname: string = 鈥溾;
age: number = 0;
ageenter: number = 0;

constructor() {
setTimeout(() => {
this.enable = false;
}, 3000);
}

check() {
if (this.firstname) {
if (this.secondname) {
if (this.surname) {
if (this.age != 0) {
this.name = this.firstname + " " + this.secondname + " " + this.surname;
this.ageenter = this.age;
} else {
alert(鈥淒ebe ingresar un valor mayor a 0鈥);
}
} else {
alert(鈥淒ebe ingresar los apellidos鈥);
}
} else {
alert(鈥淒ebe Ingresar el segundo nombre鈥);
}
} else {
alert(鈥淒ebe ingresar el primer nombre鈥);
}
}
}

Despu茅s ajuste le html:
<!鈥揟he content below is only a placeholder and can be replaced.鈥>
<div class=鈥渃ontent鈥 style=鈥渢ext-align:center鈥>
<img width=鈥300鈥 alt=鈥渓ogo鈥 src=鈥https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Mario_Series_Logo.svg/1280px-Mario_Series_Logo.svg.png鈥>
<hr />
<h2>Ingrese los nombres</h2>
<input class=鈥渇ormname鈥 placeholder=鈥淧rimer Nombre鈥 type=鈥渢ext鈥 [(ngModel)]=鈥渇irstname鈥 />
<br />
<input class=鈥渇ormname鈥 placeholder=鈥淪egundo Nombre鈥 type=鈥渢ext鈥 [(ngModel)]=鈥渟econdname鈥 />
<br />
<br />
<h2>Ingrese los apellidos</h2>
<input class=鈥渇ormname鈥 placeholder=鈥淎pellidos鈥 type=鈥渢ext鈥 [(ngModel)]=鈥渟urname鈥 />
<br />
<br />
<h2>Ingrese la edad</h2>
<input class=鈥渇ormname鈥 placeholder=鈥渁帽os鈥 type=鈥渘umber鈥 [(ngModel)]=鈥渁ge鈥 />
<br />
<span>Mi nombres es: {{ name }}</span>
<br />
<span>Mi edad es: {{ ageenter !=0 ? ageenter : 鈥溾 }}</span>
<hr />
<button class=鈥渇ormbutton鈥 [disabled]=鈥渆nable鈥 (click)=鈥渃heck()鈥>Click Me!</button>
</div>
<router-outlet></router-outlet>

<h2>Data-Binding-Two Way Data Binding</h2>
<input type="text" placeholder="Tu usuario" [(ngModel)]="NombreUsuario">
<input type="text" placeholder="Tu Apellido" [(ngModel)]="ApellidoUsuario">
<br>
<h3>Mi nombre es: {{NombreUsuario}} {{ApellidoUsuario}}</h3>

Hola! Aqui mi ejercicio: En 鈥渟rc\app\app.component.ts鈥 puse esto:

import { Component } from '@angular/core';
import { ReturnStatement } from '@angular/compiler';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title:string = 'OCR-PlatziSquare';
  subtitle:string = 'Mi primer Angular App';
  listo:boolean = false;
  timeout:number = 3; // segundos
  nombre:string = '';
  apellido:string = '';
  constructor() {
    setTimeout(() => {
      this.listo = true;
    }, this.timeout*1000);
  }
  hacerAlgo() {
    alert('Ponte a Hacer Algo');
  }
  capitalizar(str_in) {
    // google: js capitalize
    // Capitalize words in string
    // https://stackoverflow.com/questions/2332811/capitalize-words-in-string
    return str_in.replace(/\b\w/g, l => l.toUpperCase());
  }
}

Luego en 鈥渟rc\app\app.component.html鈥 puse esto:

<input type="text" placeholder="Mi nombre" [(ngModel)]="nombre"/>
<br />
<input type="text" placeholder="Mi apellido" [(ngModel)]="apellido"/>
<br />
Mi nombre es {{capitalizar(nombre)}} {{capitalizar(apellido)}}

El resultado es que el nombre y el apellido aparece con la primera letra en may煤scula, gracias al m茅todo capitalizar() creado en En 鈥渟rc\app\app.component.ts鈥.

Saludos!

Siguiendo las instrucciones del video, en el archivo app.component.html agregue otra caja de texto para introducir el apellido!

Y luego agregue la variable apellido en el archivo app.component.ts

Aqu铆 mi soluci贸n agregando un select como segundo input en el que uso TwoWayDataBinding y EventBinding:

<input type="text" placeholder="Nombre" [(ngModel)]="usuario">
<br>
<select id="" [(ngModel)]="option" (change)="selectDomain();">
  <option value="">Seleccionar</option>
  <option value="@hotmail.com">Outlook</option>
  <option value="@gmail.com">Google</option>
  <option value="@company.com">MyCompany</option>
</select>
<br><br>
<strong>e-mail: {{usuario}}{{dominio}}</strong> 
<router-outlet></router-outlet>

import { Component } from '@angular/core';
import { FormControl} from '@angular/forms';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Platzisquare';
  a = 3;
  b = 5;
  enabled = false;

  /** TwoWayDataBinding */
  option:string = '';
  usuario:string = '';
  dominio:string = '';

  /** Property DataBinding */
  constructor() {
    setTimeout(() => {
      this.enabled = true;
    }, 3000);
  }

  /** Event DataBinding */
  doSomething() {
    alert('Angular.JS');
  }

  selectDomain() {
    this.dominio = this.option;
  }
}

Seria excelente que en uno de los ejemplos usaras algo por ejemplo.

<input [(ngModel)]='text' />
<button (click)='igual()'> Click me!</button> 
<div *ngIf='platzi''> Usted es platzi user</div>

.ts
igual=false;
platzi='false';

click(){
if (text=='platzi'){
	this.platzi=true;
}
else{ 
this.platzi='false';
}
}

Unicamente valida con una funcion un poco innecesaria que el string sea platzi, de ser verdad el deberia de mostrar el div podria usarse ngOnChanges pero es un poco mas adelante!

Excelente clase, el ejercicio es bastante simple. Aqui esta mi versi贸n:

<code>
<input type="text" placeholder="Tu nombre" [(ngModel)]="nombreDeUsuario"/>
    <input type="text" placeholder="Tu apellido" [(ngModel)]="apellidoDeUsuario"/>
    <p>Mi nombre es: {{nombreDeUsuario + " " + apellidoDeUsuario }}</p>

component.ts

class Person {
    firstName: string;
    lastName: string;
    constructor(firstName: string, lastName: string) {
        this.firstName = firstName;
        this.lastName  = lastName;
    }
    greet() {
        return `Hola ${this.firstName} ${this.lastName}`;
    }
}

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Platzi Square';
  ready: boolean = false;

  person: Person = new Person('Eduardo', 'Denis')

  constructor(){
    setTimeout(() => {
      this.ready = true;
    }, 3000)
  }

  doSomething(){
    alert(this.person.greet());
  }

component.html

  <div>
    <!-- Property Binding [] -->
    <!-- Event Binding ()  -->
    <button [disabled]="!ready" (click)="doSomething()">
      Click me!
    </button>
  </div>
  <div>
    <!-- Two Ways Data Binding  -->
    <input type="text" [(ngModel)]="person.firstName">
    <input type="text" [(ngModel)]="person.lastName">

    <!-- String Interpolation {{}}  -->
    <p> {{ person.greet() }} </p>
  </div>

En app.component.ts -> AppComponent{ miApellido:string=鈥欌;}
En app.component.html -> <input type=鈥渢ext鈥 placeholder=鈥淭u apellido鈥 [(ngModel)]=鈥渕iApellido鈥/>
Hola, {{miNombre}} {{miApellido}}

Esta es la soluci贸n para el ejercicio

<<!--The content below is only a placeholder and can be replaced.-->
<div style="text-align:center">
  <h1>
    Welcome to {{ title }}!
  </h1>

  <hr />

  <button [disabled]="!cambiatValor()" (click)="mostrarMensaje()"> Dar click </button>

  <hr />

   <input type="text" placeholder="Nombre de paciente"     [(ngModel)]="nombre"/>
   <input type="text" placeholder="Apellido de paciente"   [(ngModel)]="apellido"/>
   <hr />
   mi nombre es {{nombre+apellido}}
</div>
<router-outlet>

</router-outlet>>
<import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'PlatziSquare';
  listo = false;
  nombre: string = '';
  apellido: string = '';

  constructor() {

  }

  cambiatValor() {
    setTimeout(() => {
      this.listo = true;

    }, 3000);
    return this.listo;
  }

  mostrarMensaje() {
    alert('Haciendo proceso');
  }
}
>

Aqu铆 ser铆a para agregar nombre<espacio>apellido

<div style="text-align:center">
  <h1>
    Bienvenidos a {{ title }}!
  </h1>
  <hr/>
  <input type="text" placeholder="Nombre" [(ngModel)]="nombre" />
  <br/>
  <input type="text" placeholder="Apellido" [(ngModel)]="apellido" />
  <br />
  <p>Mi nombre es {{ nombre }} &nbsp; {{ apellido }}</p>
</div>

TS

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'platzisquare';
  a = 5;
  b = 3;
  nombre:string = "";
  apellido:string = "";

  listo = false;

  constructor(){
    setTimeout(() => {
      this.listo = true;
    }, 2000);
  } 

  hacerAlgo(){
    alert("Hola");
  }
}

HTML

<div style="text-align:center">
  <h1>
    Bienvenido a {{ title }}!
  </h1>
  <h2>
    {{ a + b }}
  </h2>
  <hr>  
  <button [disabled]="!listo" (click)="hacerAlgo()">Click me!</button>
  <hr>
  <input type="text" placeholder="Nombre" [(ngModel)]="nombre">  
  <br>  
  <input type="text" placeholder="Apellido" [(ngModel)]="apellido">  
  <br>
  Mi nombre es {{nombre}} {{apellido}}
</div>

Los cuadros de texto

<input type="text" placeholder="Mi nombre" [(ngModel)]="nombre" />
<input type="text" placeholder="Mi apellido" [(ngModel)]="apellido" />

Primea forma

 <br/> Mi nombre completo es {{nombre + " " + apellido}}

Segunda forma

 <br/> Mi nombre completo es {{nombre}} {{apellido}}

Mi clase

export class AppComponent {
  title = 'PlatziSquare';
  listo = false;
  nombre = '';
  apellido = '';

  constructor() {
    setTimeout(() => {
      this.listo = true;
    }, 3000);
  }

  hacerAlgo() {
    alert('algo');
  }
}

Muy buenas funcionalidades las que nos brinda Angular 馃槀

Soluci贸n:

<div style="text-align:center">
  <h1>
    Bienvenido a {{ title }}!
  </h1>
  <h2>
    {{a+b}}
  </h2>
  <hr/>
  <button [disabled]="!listo" (click)="hacerAlgo()">Click me!</button>
  <hr/>
  <input type="text" placeholder="Tu nombre" [(ngModel)]="nombre">
  <input type="text" placeholder="Tu nombre" [(ngModel)]="apellido">
  <br>
  Mi nombre es: {{nombre}} {{apellido}}
</div>
export class AppComponent {
  title = 'PlatziSquare';
  a = 3;
  b = 5;
  listo = false;
  nombre:string = '';
  apellido:string = '';

  constructor() {
  	setTimeout(() => {
  		this.listo = true;
  	}, 3000)
  }

  hacerAlgo() {
  	alert('Haciendo algo');
  }
}

HTML:

<p>
    <input type="text" placeholder="Type your name.." [(ngModel)]="name" />
  </p>
  <p>
    <input
      type="text"
      placeholder="Type your last name..."
      [(ngModel)]="lastName"
    />
  </p>
  <br />
  <h3>Your name is: {{ name }} {{ lastName }}</h3>```

**TypeScript:**



name: String = ; lastName: String =;


Note que si esta tienes activado el google translate no funciona ngModel
pude evitarlo agregando una etiqueta meta en el html

<meta name="google" content="notranslate" />

Alguien me puede dar una solucion mas efectiva, ya que en alg煤n momento el usuario puede usar google translate

la solucion es aumentando un par de lineas en app.compnent.html
<input type=鈥渢ext鈥 placeholder=鈥淭us Apellidos鈥 [(ngModel)] = 鈥渁pellidos鈥 />
<br />
Mis Nombres son {{nombre}} {{apellidos}}

y en el archivo app.component.ts
 crear las variables apellidos 

Aqui va mi aporte para el 2 Data Binding:

app.component.html

<!--The content below is only a placeholder and can be replaced.-->
<div style="text-align:center">
  <h1>
    Bienvenido a {{ title }}!
  </h1>
  <h4>{{a + b}}</h4>
  <hr />
    <button [disabled] = "!listo" (click)="hacerAlgo()">Click</button>
  <hr/>
  <input type="text" placeholder="Tu Primer Nombre" [(ngModel)]="nombre1" />
  <br/>
  <input type="text" placeholder="Tu Segundo NOmbre" [(ngModel)]="nombre2" />
  <br/>
  Mi nombre es {{nombre1+' '+nombre2}}
  <img width="300" alt="Angular Logo" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg==">
</div>


<router-outlet></router-outlet>```

app.component.ts:



import { Component } from 鈥楡angular/core鈥;

@Component({
selector: 鈥榓pp-root鈥,
templateUrl: 鈥./app.component.html鈥,
styleUrls: [鈥./app.component.css鈥橾
})
export class AppComponent {
title = 鈥楶latziSquare鈥;
a = 3;
b = 5;
listo=false;
nombre1 = 鈥樷;
nombre2 = 鈥樷;

constructor(){
setTimeout(() => {
this.listo = true;
},3000)
}
hacerAlgo(){
alert(鈥楬aciiendo algo鈥);
}
}

Tambien puse los nombres por separado {{Nombre1}} y {{Nombre2}}
<h1>Two way binding</h1>
Primer nombre: <input type="text" [(ngModel)]="nombre1">
<br>
Segundo nombre: <input type="text" [(ngModel)]="nombre2">
<br>
Tu nombre es: {{nombre1}} {{nombre2}}```

Yo lo hice de esta manera鈥

app.component.html ::

  <button [disabled]="!listo" (click)="hacerAlgo()">Click me!</button>
  <hr />
  <input type="text" placeholder="Tu nombre" [(ngModel)]="nombre" />
  <br />
  <input type="text" placeholder="Tu apellido" [(ngModel)]="apellido" />
  <br />
  <input type="text" placeholder="Tu fecha de nacimiento" [(ngModel)]="nacimiento" />
  <br />
  <br />
  Tu nombre es {{nombre}}, tu apellido es {{apellido}}, y seguramente tu edad este a帽o, ser谩 {{hoy-nacimiento}}!
</div>

app.component.ts ::

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'SERGIOxelmundo';
  listo = false;
  nombre = '';
  apellido = '';
  nacimiento = '';
  hoy = 2019;

  constructor(){
  	setTimeout(() => {
  		this.listo = true;
  	}, 3000)
  }
  hacerAlgo(){
  	alert('Haciendo algo..!')
  }
}

Saludos,

Sergio
@SERGIOxelmundo

Aqu铆 esta mi soluci贸n

<input type="text" placeholder="Tu Nombre" [(ngModel)]="nombre">
<br>
<input type="text" placeholder="Tu Apellido" [(ngModel)]="apellido">
<h2>Mi nombre completo es {{nombre}} {{apellido}}</h2>```

Nota: No me funcion贸 con la ruta de @angular/core鈥 tuve que cambiar la ruta a @angular/forms.

<input type="text" placeholder="Tu nombre" [(ngModel)]="nombre" />
  <input type="text" placeholder="Tu apellido" [(ngModel)]="apellido">
  <br />
  Mi nombre es {{nombre}} {{apellido}}```

<div style=鈥渢ext-align:center鈥>
<h1>
Bienvenido a {{ title }}!
</h1>
<h2>

</h2>
<hr />
<button [disabled]="!listo" (click)=鈥渉aceralgo()鈥>Click me!</button>
<hr />
<input type=鈥渢ext鈥 placeholder=鈥淭u nombre鈥 [(ngModel)]=鈥渘ombre鈥/>
<br />
Mi nombre es {{nombre}}
<hr />
<input type=鈥渢ext鈥 placeholder=鈥淭u Apellido鈥 [(ngModel)]=鈥渁pellido鈥/>
<br />
Mi apellido es {{apellido}}
</div>

Aqu铆 pongo mi ejemplo

<div>
  Nombre:
  <input type="text" placeholder="T煤 Nombre..." [(ngModel)]="nombre">
</div>
<div>
  Apellido:
  <input type="text" placeholder="T煤 Apellido..." [(ngModel)]="apellido">
</div>
<div>
  T煤 nombre completo es {{ nombre }} {{ apellido }}
</div>
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Ejemplo de Platzi';
  nombre : string = '';
  apellido : string = '';
<hr>
Mi Nombre es
<input type="text" placeholder="Tu Nombre" [(ngModel)]="nombre">
<br>
{{ nombre }}
<br>
Mi Apellido es
<input type="text" placeholder="Tu Apellido" [(ngModel)]="apellido">
<br>
{{ apellido }}
<br>```

export class AppComponent {
  title = 'Platzi Square';
  nombre = '';
  apellido = '';

Simplemente duplique el Codigo para ingresar otra caja de texto como ingresar el nombre completo y la sume en interpolationString y creando por supuesto la variable apellido

<input type=鈥渢ext鈥 placeholder=鈥淭u Nombre鈥 [(ngModel)]=鈥渘ombre鈥 />
<input type=鈥渢ext鈥 placeholder=鈥淭u Apellido鈥 [(ngModel)]=鈥渁pellido鈥 />
<br />
Tu nombre completo es: {{nombre + apellido}}

Juntando Nombre y Apellido

    <input type="text" placeholder="Tu nombre"  [(ngModel)]="nombre"/>
    <hr />
    <input type="text" placeholder="Tu apellido" [(ngModel)]="apellido"/>
    <br />
    Mi nombre es {{nombre}} {{apellido}}```

nombre:string = 鈥樷;
apellido:string = 鈥樷;```

<input type=鈥渢ext鈥 [(ngModel)]=鈥渘ombre鈥 />
<br/>
Mi nombre es {{nombre}}

 <input type="text" placeholder="Tu nombre" [(ngModel)]="nombre" />
  <input type="text" placeholder="Tu Apellido" [(ngModel)]="apellido" />
  <br>
  Mi nombre completo es {{nombre+" "+apellido}}
<input type="text" [(ngModel)]="user" placeholder="usuario">
<input type="text" [(ngModel)]="user2" placeholder="apellido">

<h1>{{user}} {{user2}}</h1>
  <input type="text" placeholder="Tu nombre 1" [(ngModel)]="nombreOne">
  <input type="text" placeholder="Tu nombre 2" [(ngModel)]="nombreTwo">
  <br>
  {{nombreOne}} {{nombreTwo}}
 <hr />
  <input type="text" placeholder="Tu nombre" [(ngModel)]="nombre"/>
  <br/>

  <input type="text" placeholder="Tu apellido" [(ngModel)]="apellido"/>
  <br/>

y cambiamos el TS appComponent

  apellido:string = '';

/platzisquare/src/app/app.component.html

...
  <input type="text" placeholder="Tu primer nombre" [(ngModel)]="nombre1" />
  <input type="text" placeholder="Tu segundo nombre" [(ngModel)]="nombre2" />
  <br>
  Mi nombre es {{ nombre1 }} {{ nombre2 }}
...

/platzisquare/src/app/app.component.ts

export class AppComponent {
  ...
  nombre1:string = '';
  nombre2:string = '';
  ...
}

Primero cambiamos un poco las lineas en el archivo app.component.html

<hr />
  <input type="text" placeholder="Nombre 1" [(ngModel)]="nombre" />
  <br>
  <input type="text" placeholder="Nombre 2" [(ngModel)]="nombre2" />
  <br />
  El nombre combinado es {{nombre + nombre2}}

y por ultimo agregamos una variable mas al archivo app.component.ts

  nombre:string = '';
  nombre2:string = '';

Esta es mi solucion

<input type=鈥渢ext鈥 style=鈥渢ext-align:center鈥 placeholder=鈥淣ombre鈥 [(ngModel)]=鈥渘ombre鈥/>
<input type=鈥渢ext鈥 style=鈥渢ext-align:center鈥 placeholder=鈥渁pellido鈥 [(ngModel)]=鈥渁pellido鈥/>
<br />
Mi nombre es {{nombre }} {{apellido}}

![](

El app.component.html

<!--The content below is only a placeholder and can be replaced.-->
<div style="text-align:center">
  <h1>
    Bienvenido a {{ title }}!
  </h1>
  <img width="300" alt="Angular Logo" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg==">
  <div class="name">
    <input type="text" [(ngModel)]="nombre" placeholder="Tu nombre"/> |
    <input type="text" [(ngModel)]="apellido" placeholder="Tu apellido">
    <p>Tu nombre completo es {{nombre + ' ' + apellido}}</p>
  </div>
</div>

Y el app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'platzisquare';
  nombre:string = '';
  apellido:string = '';
}

app,component.html

<input type="text" placeholder="tu nombre..." [(ngModel)]="nombre">
<input type="text" placeholder="tu apellido..." [(ngModel)]="apellido">
<br>
Mi nombre es: {{nombre + ' ' + apellido}}

app,component.ts

  nombre:string = '';
  apellido:string = '';

Hola. Para usar Two Way Data Binding es necesario importar FormsModule en app.module.ts, al menos en Angular 8

import { FormsModule } from '@angular/forms';

Y agregarlo en el array de imports

@NgModule({
  declarations: [...],
  imports: [...FormsModule],
  providers: [],
  bootstrap: [...]

No se si lo menciono el profesor, pero yo lo olvide y muestra un error. Por si alguien mas lo olvido o no se menciono 馃槂

Yo utilice un event binding en cada input para llamar una funcion que agregue ese input

.html

<input
    type="text"
    placeholder="Name"
    [(ngModel)]="name"
    (keypress)="addName()"
  />
  <input
    type="text"
    placeholder="Lastname"
    [(ngModel)]="lastname"
    (keypress)="addLastname()"
  />
  <br />
  <p *ngIf="fullname">My name is {{ fullname }}</p>

.ts

addName() {
    setTimeout(() => {
      this.fullname = this.name;
    }, 200);
  }

  addLastname() {
    setTimeout(() => {
      this.fullname = this.name + ' ' + this.lastname;
    }, 200);
  }
  <hr/>
  <input type="text" placeholder="tu nombre" [(ngModel)]="nombre"/>
  <hr/>
  <input type ="text" placeholder="tu apellido" [(ngModel)]="apellido"/>
  <br/>
  Mi nombre completo es : {{nombre}} {{apellido}}

Esta es mi soluci贸n.

app.component.ts

app.component.html

Resultado

html

<!--The content below is only a placeholder and can be replaced.-->
<div style="text-align:center">
  <h1>
    Bienvenido a {{title}}!
  </h1>
  <h2>
    {{a+b}}
  </h2>
  <hr />
  <button [disabled]="!listo" (click)="hacerAlgo()"> Click me </button>
  <hr />
  <input type="text" placeholder="Tu nombre" [(ngModel)]="nombre">
  <br />
  <input type="text" placeholder="Tu apuellido" [(ngModel)]="apellido">
  <br />
  Mi Apellido es {{apellido}}
  <br />
  Tu nombre completo es : {{nombre + ' ' + apellido}}
</div>

TS

nombre:string = '';
 apellido:string = '';

app.component.html

app.component.ts

<input type="text" placeholder="Tu nombre" [(ngModel)]="nombre" />
  <input type="text" placeholder="Tu apellido" [(ngModel)]="apellido" />
  Mi nombre completo es {{nombre+' '+apellido}}

export class AppComponent {
  nombre = '';
  apellido = '';
}

Soluci贸n para mostrar el nombre completo:
app.component.html

app.component.ts

Resultado

mi solucion
app.component.ts

app.component.html

Resultado

<input type="text" placeholder="Nombre" [(ngModel)]="Nombre" />
<br />
<input type="text" placeholder="Apellido" [(ngModel)]="Apellido" />
<br />
Bienvenido {{Nombre}} {{Apellido}} 
Nombre:string=''; 
Apellido:string=''; 
<code>
<div style="text-align:center">
  <h1>
    <span>{{ title }} app is running!</span>
  </h1>
  <h2>
    {{a+b}}
  </h2>
  <button [disabled]="!listo" (click)="hacerAlgo()">Click me!</button>
  <hr>
  <input type="text" placeholder="Tu Nombre" [(ngModel)]="nombre" />
  <br/>
  <input type="text" placeholder="Tu Apellido" [(ngModel)]="apellido">
  <br/>
  <h1>
    Mi Nombre es {{nombre}} <strong>{{apellido}}</strong>
  </h1>

</div>


Es normal que funcione aun sin haber declarado la variable nombre?, si es as铆, 驴Porque sucede esto ?

<!-- Resources -->
<h2>Resources</h2>
<hr/>
<button [disabled]="!listo"> click me!</button>
<hr/>
<button [disabled]="!listo1" (click)=鈥渉acerAlgo()鈥> click me!</button>
<hr/>
<input type=鈥渢ext鈥 placeholder=鈥渢u nombre鈥 [(ngModel)]=鈥渘ombre鈥 />
<input type=鈥渢ext鈥 placeholder=鈥渢u nombre1鈥 [(ngModel)]=鈥渘ombre1鈥 />

<hr/>
Mi nombre es {{nombre + 鈥 y 鈥 + nombre1}}

/////////////////////////////////////

export class AppComponent {
title = 鈥 Hola Platzisquare鈥;
a=2;
b=4;
listo=false;
listo1=false;
nombre:string =鈥欌;
nombre1:string =鈥欌;
constructor(){
setTimeout(() => {
this.listo=true;
this.listo1=true;
},3000)
}
hacerAlgo(){
alert(鈥楬aciendo algo鈥);
}
}

<!-- app.component.html -->
<div style = 鈥渢ext-align: center鈥>
<h1> Bienvenido a {{title}} </h1>
<hr />
<button [disabled] = 鈥!listo鈥 (click)=鈥渉acerAlgo()鈥 >click me</button>
<hr />
<input type = 鈥渢ext鈥 placeholder=鈥淭u nombre鈥 [(ngModel)]=鈥渘ombre鈥 >
<input type = 鈥渢ext鈥 placeholder = 鈥淭u apellido鈥 [(ngModel)]=鈥渁pellido鈥/>
<br />
Mi nombre es {{nombre}} {{apellido}}
</div>

//app.component.html
import { Component } from 鈥楡angular/core鈥;

@Component({
selector: 鈥榓pp-root鈥,
templateUrl: 鈥./app.component.html鈥,
styleUrls: [鈥./app.component.css鈥橾
})
export class AppComponent {
title = 鈥榩latzisquare鈥;
listo = false
nombre: string = ''
apellido: string = 鈥樷

constructor(){
setTimeout(() => {
this.listo = true
},3000)
}
hacerAlgo(){
alert(鈥楬aciendo algo鈥)
}
}

<div style="text-align: center"> <h1>Bienvenido a {{ title }}</h1> <h2>Tenemos a {{ a }} + {{ b }} = {{ a + b}}</h2> <button [disabled]="!listo" (click) = "HacerAlgo()">Haz click en mi</button> <hr/> <input type="text" placeholder="Nombre ej Andrea" [(ngModel)]="nombre"> <input type="text" placeholder="Apellido ej Lamon" [(ngModel)]="apellido"> <hr/> <p>Mi nombre es {{ nombre }} {{apellido}}</p> </div>

`import { Component } from 鈥楡angular/core鈥;

@Component({
selector: 鈥榓pp-root鈥,
templateUrl: 鈥./app.component.html鈥,
styleUrls: [鈥./app.component.css鈥橾
})
export class AppComponent {
title = 鈥榩latzi Square App鈥;
a = 3;
b = 5;
listo = false;
nombre = 鈥樷;
apellido = 鈥樷;
constructor(){
setTimeout(() => {
this.listo = true;
},3000)
}
hacerAlgo(){
alert(鈥楬aciendo algo鈥);
}
}`

<input type="text" placeholder="Tu nombre" [(ngModel)]="nombre">
  <br>
  <input type="text" placeholder="Tu nombre 2" [(ngModel)]="nombre2">
  <br>
  Nombre 1 es igual {{nombre}}
  <br>
  Nombre 2 es igual {{nombre2}}```

Mi solucion 馃槃

<!-- Two way Data Bindig y string interpoletion -->
      <input type="text" placeholder="Tu nombre" [(ngModel)]="nombre">
      <input type="text" placeholder="Tu Apellido" [(ngModel)]="apellido">

      <br />
      <p>Mi nombre es {{nombre}} y mi apellido {{apellido}}</p>

En app.component.ts
nombre: string ="";
apellido: string ="";

en el app.component.html

<input type=鈥渢ext鈥 placeholder=鈥淭u numbre鈥 [(ngModel)] = 鈥渘ombre鈥>
<hr>
<input type=鈥渢ext鈥 placeholder=鈥淭u Apellido鈥 [(ngModel)] = 鈥渁pellido鈥>
<br>
mi nombre completo es {{nombre}} {{apellido}}

A mi me sale el siguiente error

Soluci贸n

export class AppComponent {
  nombre:String = '';
  apellido:String = '';
}
<hr>
  <input type="text" placeholder="tu nombre" [(ngModel)]="nombre">
  <input type="text" placeholder="tu apellido" [(ngModel)]="apellido">
  <hr>
  Mi nombre es {{ nombre }} {{ apellido}}
<div>
    <label for="">Nombre</label> 
    <input type="text" placeholder="Tu nombre" [(ngModel)]="nombre">
  </div>
  <div>
    <label for="">Apellido:</label>
    <input type="text" placeholder="Tu apellido" [(ngModel)]="apellido">
  </div>

  <div>
    <p>Mi nombre es: {{nombre}} {{apellido}}</p>
  </div>
export class AppComponent {
  	title = 'Angular4Platzi';
  	listo = false;
  	nombre:string = '';
  	apellido:string = '';
<div>
    <button type="button" (click) = "changeTitle( 'Nuevo nombre' )" > Click me! </button>
    <br>
    <hr/>
    <br>
    <input type="text" placeholder="Ingrese nombre" [(ngModel)] = "firstName" />
    <br>
    <input type="text" placeholder="Ingrese Apellido" [(ngModel)] = "lastName" />
    <br>
    <span> Nombre: {{firstName}} </span>
    <br>
    <span> Apellido: {{lastName}} </span>
    <br>
  </div>
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'berckmanCurso';
  firtName:string = "";
  lastName:string = "";
 
  changeTitle(title){
    this.title = title;
  }
}

Por ac谩 dejo mi c贸digo:
app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.sass']
})
export class AppComponent {
  title = 'Angular';
  name:string = '';
  lastName:string = '';
  notReady:boolean = true;

  check(){
    if (this.name === '' || this.lastName === '') {
      this.notReady=true;
    }else{
      this.notReady=false ;
    }
  }

  hello(){
    alert(`Welcome to this App ${this.name} ${this.lastName}`);
  }
}

app.component.html

  <input type="text" placeholder="Nombre" (keyup)="check()" [(ngModel)]="name"><br>
  <input type="text" placeholder="Apellido" (keyup)="check()" [(ngModel)]="lastName"><br>
    Mi nombre es {{name}} {{lastName}}
  <button [disabled]="notReady" (click)="hello()">Hi</button>

<input type text=鈥渢ext鈥 placeholder=鈥淣ombre鈥 [{ngModel}]=鈥渘ame鈥/>
<br/>
<input type text=鈥渢ext鈥 placeholder=鈥淎pellido鈥 [{ngModel}]=鈥渓astName鈥/>
<br/>
{{name + 鈥 鈥 + lastName}}

// variables app.component.ts
usuarioNombre: string = '';
usuarioApellido: string = '';

//app.component.html
<label for="nombre">Ingresa tu nombre</label><br>
    <input type="text"  name="nombre" [(ngModel)]="usuarioNombre"><br>
    <hr>
<label for="apellido">Ingresa tu apellido</label><br>
    <input type="text"  name="apellido" [(ngModel)]="usuarioApellido"><br>
<h6 class="display">
    {{usuarioNombre + ' ' + usuarioApellido}}
</h6>