DataBinding: Enlace de datos y eventos
Data Binding (Enlace de datos) es el mecanismo que permite sincronizar los datos entre el modelo de datos de la aplicación y la vista (la UI). El data binding facilita la interacción del usuario con la aplicación, permitiendo que los cambios en el modelo de datos se reflejen automáticamente en la vista y viceversa.
Tipos de Data Binding en Angular
- Interpolación:
{{ message }}
Vincula datos del componente a la vista. La interpolación se refiere a la incrustación de expresiones en texto marcado. De forma predeterminada, la interpolación utiliza las llaves dobles y como delimitadores.{{
}}
- Binding de Propiedad:
[value]="userName"
Vincula propiedades de elementos DOM a datos del componente. - Binding de Evento:
(click)="sayHello()"
Vincula eventos del DOM a métodos del componente. - Binding de Atributo:
[attr.role]="role"
Vincula atributos de elementos DOM a datos del componente. - Binding Bidireccional:
[(ngModel)]="userName"
Vincula datos del componente a la vista y viceversa.
Video Tutoriales:
- Interpolacion: https://youtu.be/3B2kUT8gsik
- Interpolación {{ angular }} / On way data binding https://youtu.be/qjuYVJPb_Qg
- Enlace de datos bidireccional / Two-way data binding https://youtu.be/EuFh5s5lYIU
- Angular 17: Two Way Binding: https://youtu.be/q-TBDu2xwoQ
- Event Binding o enlace de evento: https://youtu.be/XPJmsKRuMTg
- Event binding ó (enlace de eventos ) Angular https://youtu.be/0qvQ_0A35b8
- Class Binding o enlace de clases: https://youtu.be/uipYQVQd3Iw
- Property Binding o enlaces de propiedades: https://youtu.be/bGIKUzcyArA
- ANGULAR: Two Way Data Binding de Inputs con onPush https://youtu.be/DQEddwB5Rpc
- Data Binding in Angular 18 https://youtu.be/6axfJtFWsiQ
- DataBinding: https://youtu.be/g8geh3lFpBg
Resumen de Data Binding
{{ message }}
[value]="userName"
(click)="sayHello()"
[attr.role]="role"
[(ngModel)]="userName"
Estructura del proyecto
// Creando nuevo proyecto = practica2
ng new practica2
// Entramos al nuevo proyecto
cd practica2
// Generamos el componente llamado = data-binding
ng generate component data-binding
// Generamos sus componentes --inline-template --inline-style
ng g c --inline-template --inline-style data-binding/Interpolacion
ng g c --inline-template --inline-style data-binding/Binding-Propiedad
ng g c --inline-template --inline-style data-binding/Binding-Evento
ng g c --inline-template --inline-style data-binding/Binding-Atributo
ng g c --inline-template --inline-style data-binding/Binding-Bidireccional
Componentes del data-binding
// data-binding.component.ts
import { Component } from '@angular/core';
// Agregando los componentes creados
import {InterpolacionComponent } from './interpolacion/interpolacion.component';
import {BindingPropiedadComponent} from './binding-propiedad/binding-propiedad.component';
import {BindingEventoComponent} from './binding-evento/binding-evento.component';
import {BindingAtributoComponent} from './binding-atributo/binding-atributo.component';
import {BindingBidireccionalComponent} from './binding-bidireccional/binding-bidireccional.component';
@Component({
selector: 'app-data-binding',
standalone: true,
// Declaramos que hemos Agregado los componentes y los vamos usar
imports: [InterpolacionComponent, BindingPropiedadComponent,
BindingEventoComponent, BindingAtributoComponent, BindingBidireccionalComponent],
template: `
<h3>Data-Binding</h3>
<app-interpolacion/>
<app-binding-propiedad/>
<app-binding-evento />
<app-binding-atributo/>
<app-binding-bidireccional/>
`,
styles: [`h3 { color: blue; }`]
})
export class DataBindingComponent { }
Ejemplos de Cada Data Binding en Angular v18
1. Interpolación
// interpolacion.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-interpolacion',
standalone: true,
imports: [],
template: `
<h3>Interpolación = {{message}} </h3>
`,
styles: `[]`
})
export class InterpolacionComponent {
message = 'On way data binding {{message}} ';
}
import { Component } from '@angular/core';
// @for. Se refiere a cada uno de los miembros de la matriz
@Component({
selector: 'app-cliente',
standalone: true,
template: `
<div> <!-- Listando Matriz Uno -->
<ul>
@for (cliente of clientes; track cliente) {
<li>{{ cliente.name }}</li>
}
</ul>
`,
})
export class ClienteComponent {
// Matriz Uno
clientes = [{name: 'Carlos'}, {name: 'Elmer'}, {name: 'Jose'}];
cliente = 'Rocha';
}
2. Binding de Propiedad
Usar el enlace de propiedades de una manera que le ayude a reducir los errores y mantener el código legible. Una expresión de plantilla debe dar como resultado el tipo de valor que espera la propiedad de destino. Si la propiedad de destino espera una cadena: string, si espera un número: number, si espera un objeto: object
// .component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-binding-propiedad',
standalone: true,
imports: [],
template: `
<h3>Property binding: <input [value]="userName"></h3>
`,
styles: [`h3 { color: green; }`]
})
export class BindingPropiedadComponent {
userName = ' [value]="userName" ';
}
// carrusel.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-carrusel',
standalone: true,
imports: [],
// Agregar CDN de Bootstrap en index.html
template: `
<div>
<button class="btn btn-danger" (click)="imag = 'https://www.w3schools.com/html/pic_trulli.jpg'">Imagen-1</button>
<button class="btn btn-success mx-2" (click)="imag = 'https://www.w3schools.com/html/img_chania.jpg'">Imagen-2</button>
<button class="btn btn-primary" (click)="imag = 'https://www.w3schools.com/html/programming.gif'">Imagen-3</button>
<button class="btn btn-secondary" (click)=" imag = 'https://www.w3schools.com/html/img_girl.jpg'"> imagen inicial</button>
</div>
<img [src]="imag" alt="img_girl.jpg" width="250" height="300">
`,
styles: ``
})
export class CarruselComponent {
imag:string = "https://www.w3schools.com/html/img_girl.jpg";
}
3. Binding de Evento
// .component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-binding-evento',
standalone: true,
imports: [],
template: `
<h3>Event Binding: (click)="sayFuncion()" </h3>
<button (click)="sayFuncion()">Click me</button>
`,
styles: ``
})
export class BindingEventoComponent {
sayFuncion() {
alert('Binding de Evento, sayFuncion() ');
}
}
// variable-plantilla.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-variable-plantilla',
standalone: true,
imports: [],
// Agregar CDN de Bootstrap en index.html
template: `
<br>
<h3>variable de plantilla </h3>
<input type="text" placeholder="Ingresa tu nombre" class="form-control" #name>
<div>
<button class="btn btn-primary" (click)="mostrar_en_consola(name.value)">Mostrar en Consola</button>
<!-- -->
<button (click)="miAlerta(name.value)">Mostrar como alerta</button>
</div>
<br>
`,
styles: ``
})
export class VariablePlantillaComponent {
mostrar_en_consola(name:string){
console.log(name);
}
miAlerta(name:string) {
alert(name);
}
}
// botones.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-botones',
standalone: true,
imports: [],
// Agregar CDN de Bootstrap en index.html
template: `
<div>
<button [class]="{'disabled':on_off}" class="btn btn-danger" (click)="text_color = 'text-danger'">Color Rojo</button>
<button [class]="{'disabled':on_off}" class="btn btn-success mx-2" (click)="text_color = 'text-success'">Color Verde</button>
<button [class]="{'disabled':on_off}" class="btn btn-primary" (click)="text_color = 'text-primary'">Color Azul</button>
</div>
<p [class]="text_color">Texto que va a cambiar de color</p>
<button class="btn btn-secondary" (click)="on_off = !on_off"> Activar/Desactivar</button>
`,
styles: ``
})
export class BotonesComponent {
text_color:string = '';
on_off:Boolean = false;
}
4. Binding de Atributo
// .component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-binding-atributo',
standalone: true,
imports: [],
template: `
<h3> attribute-binding: [attr.role]="role"</h3>
<div [attr.role]="role">Contentido, Binding de Atributo </div>
`,
styles: ``
})
export class BindingAtributoComponent {
role = 'admin';
}
5. Binding Bidireccional
// .component.ts
import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
@Component({
selector: 'app-binding-bidireccional',
standalone: true,
imports: [FormsModule],
template: `
<h3> two-way-binding: [(ngModel)]="userName" </h3>
<input [(ngModel)]="userName">
<p> Binding Bidireccional = Hola, {{ userName }}!</p>
`,
styles: ``
})
export class BindingBidireccionalComponent {
userName = '';
}
mmm