¿Qué es un Template?
Un template en Angular es un fragmento de
HTML que se utiliza para definir la estructura y el contenido visual de
un componente. Los templates pueden incluir directivas, bindings
(enlaces) de datos, pipes y elementos de HTML estándar. Los templates
son fundamentales para definir la interfaz de usuario de las
aplicaciones Angular.
Template syntax: https://angular.dev/guide/templates
// Generando los componentes --inline-template
ng generate component --inline-template templates
ng g c --inline-template templates
// Generamos sus componentes --inline-template --inline-style
ng g c --inline-template --inline-style templates/tipo-templates
Sintaxis de plantilla (template): En Angular, una *template* es un pedazo de HTML.
@Component({ Template: ´ ´ , styles: [` `] })
¿Para qué sirve? Los templates sirven para crear vistas (UI) dinámicas en las aplicaciones Angular. Permiten enlazar datos, reaccionar a eventos del usuario, y aplicar directivas y pipes para manipular la presentación y el comportamiento del contenido visual.
Recomencaciones al usar Template (plantilla):
Al usar una expresión en el Template, siga estas prácticas recomendadas
- Usar expresiones cortas: Para la prueba de codigos siempre que sea posible.
- Ejecución rápida: Utilice nombres de propiedad o llamadas a métodos.
- Mantenga la lógica de la aplicación y del negocio en el componente, donde sea accesible para desarrollar y probar.
@Component({ template: ` <h3> {{
interpolación
}} </h3> `, styles: [`h3 { color: blue; }`] })
Tipos de Templates en Angular
- Templates Inline: se define dentro del decorador @Component.
- Templates Externos: se define en un archivo HTML separado
- Templates con Directivas Estructurales: Utilizan directivas como *ngIf y *ngFor
- Templates con Bindings de Datos: Vinculan datos del componente (Bindings = Enlace ).
- Templates con Pipes: Transforman los datos antes de mostrarlos.
Videotutoriales:
- Variables de plantilla (template variables): https://youtu.be/FjcDYajRkl0
- Plantillas HTML - Primera Parte https://youtu.be/R9KQjXECuEA
- Plantillas HTML - Segunda Parte https://youtu.be/9NXhwn2mWPM
-
IMPORTANTE: Para eliminar el riesgo de ataques de inyección de script, Angular no apoya el elemento <script>
en plantillas.
Angular ignora el
etiqueta <script>
y da una advertencia a la consola del navegador.
Ejemplos de Cada Template
1- Template Inline: se define directamente dentro del decorador @Component.
// inline-template.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-inline-template',
standalone: true,
imports: [],
template: ` <h3> Esto es un {{ name1 }}, con interpolación !</h3> `,
styles: [`h3 { color: red; }`]
})
export class InlineTemplateComponent {
name1 = 'Template Inline en Angular';
}
2- Template Externo: se define en un archivo HTML separado y se referencia desde el decorador @Component.
// external-template.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'app-external-template',
standalone: true,
imports: [],
templateUrl: './external-template.component.html',
styles: [`h3 { color: green; }`]
})
export class ExternalTemplateComponent {
name2 = 'Template Externo en Angular';
}
Archivo de Template (external-template.component.html):
<!-- external-template.component.html -->
<h3> Esto es un {{ name2 }}, con On way data binding ! </h3>
3- Template con Directivas Estructurales: Utilizan directivas como *ngIf y *ngFor para modificar el DOM.
// structural-directives-template.component.ts
import { Component } from '@angular/core';
// Agregando la Directiva CommonModule para hacer uso del ngIf, ngFor, y ngClass,...
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-structural-directives-template',
standalone: true,
// Confirmando que hemos agregado el componente: CommonModule
imports: [CommonModule, ],
template: `
<h3 ngif="isVisible">Template con Directivas Estructurales</h3>
<ul>
<li ngfor="let item of items">{{ item }}</li>
</ul>
`,
styles: [`h3,li {color: blue;} `]
})
export class StructuralDirectivesTemplateComponent {
isVisible = true;
items = ['Item 1', 'Item 2', 'Item 3'];
}
4- Template con Bindings de Datos: Vinculan datos del componente a la vista.
Componente:
// data-binding-template.component.ts
import { Component } from '@angular/core';
// Agregando la Directiva FormsModule para hacer uso del [(ngModel)],...
import { FormsModule } from '@angular/forms';
@Component({
selector: 'app-data-binding-template',
standalone: true,
// Agregando y confirmando que utilizaremos el FormsModule
imports: [ FormsModule ],
template: ` <h3>Template con Bindings de Datos: Two-way data binding</h3>
<input name3="" ngmodel="" /p>
<p>Hello, {{ name3 }}!</p>
`,
styles: [`h3 { color: brown; }`]
})
export class DataBindingTemplateComponent {
name3 = '';
}
5- Template con Pipes: Transforman los datos antes de mostrarlos.
// pipes-template.component.ts
import { Component } from '@angular/core';
// Agregando Built-in pipes (DatePipe, CurrencyPipe, UpperCasePipe, LowerCasePipe. etc.)
import { CurrencyPipe, DatePipe, LowerCasePipe, UpperCasePipe } from '@angular/common';
@Component({
selector: 'app-pipes-template',
standalone: true,
imports: [ DatePipe, CurrencyPipe, UpperCasePipe, LowerCasePipe],
template: `
<h3> Template con Pipes: Built-in pipes (DatePipe, CurrencyPipe, UpperCasePipe) </h3>
<p>{{ amount | currency:'USD' }}</p>
<p>Date: {{ today | date }}</p>
<p>The (date:'fullDate' | uppercase): {{ birthday | date:'fullDate' | uppercase }}</p>
<p>The (date:'dd/mm/yyyy' | lowercase): {{ birthday | date:'dd/mm/yyyy' | lowercase }}</p>
`,
styles: [`h3, p {color: purple;} `]
})
export class PipesTemplateComponent {
amount = 12345.67;
today = new Date();
birthday = new Date();
}
APP: Estructura de un Proyecto Angular con los tipos de Templates
practica2/
├── src/
│ ├── app/
│ │ ├── templates/
│ │ │ └── inline-template.component.ts
│ │ │ └── external-template.component.ts
│ │ │ └── external-template.component.html
│ │ │ └── structural-directives-template.component.ts
│ │ │ └── data-binding-template.component.ts
│ │ │ └── pipes-template.component.ts
│ │ ├── app.component.ts
│ │ ├── app.component.html
│ │ ├── app.component.css
│ ├── assets/
│ ├── environments/
│ ├── index.html
│ ├── main.ts
│ ├── styles.css
│ └── polyfills.ts
├── angular.json
├── package.json
├── README.md
└── tsconfig.json
APP: Creando nuevo proyecto = Practica2
// Creando nuevo proyecto = Practica2
C:\ANGULAR-v18\Cmder_Consola
ng new practica2
// Seleccionando nuestra preferencia de estilos css y Servidor.
stylesheet format to use? CSS
enable Server-Side Rendering (SSR)? yes
// Entrando a la directiva o carpeta del proyecto creado
cd practica2
C:\ANGULAR-v18\Cmder_Consola\practica2 (master)
// Abriendo proyecto (APP= Practica2) en editor Visual estudio code
code .
// Generando los componentes --inline-template
ng generate component --inline-template templates
// Generando los componentes del tipo: --inline-template --inline-style
ng g c --inline-template --inline-style templates/tipo-templates
// Generando tipo: inline-template --inline-style
ng g c --inline-template --inline-style templates/tipo-templates/inline-template
// Generando tipo: external-template = componente normal generado por consola
ng generate component templates/tipo-templates/external-template
// Generando tipo: data-binding-template
ng g c --inline-template --inline-style templates/tipo-templates/data-binding-template
// Generando tipo: structural-directives-template
ng g c --inline-template --inline-style templates/tipo-templates/structural-directives-template
// Generando tipo: pipes-template
ng g c --inline-template --inline-style templates/tipo-templates/pipes-template
Importación de cada componente Template
// tipo-templates.component.ts
import { Component } from '@angular/core';
// Agregando los Tipos de Templates
import { InlineTemplateComponent } from './inline-template/inline-template.component';
import { ExternalTemplateComponent } from './external-template/external-template.component';
import { StructuralDirectivesTemplateComponent }
from './structural-directives-template/structural-directives-template.component';
import { DataBindingTemplateComponent }
from './data-binding-template/data-binding-template.component';
import {PipesTemplateComponent } from './pipes-template/pipes-template.component'
@Component({
selector: 'app-tipo-templates',
standalone: true,
// Declarando o confirmando el uso de componentes templates
imports: [InlineTemplateComponent, ExternalTemplateComponent,
StructuralDirectivesTemplateComponent, DataBindingTemplateComponent,
PipesTemplateComponent ],
template: `
<h1> Tipo de componente: </h1>
<app-inline-template />
<app-external-template />
<app-structural-directives-template />
<app-data-binding-template />
<app-pipes-template />
`,
styles: [`h1 { color: #4d042d; }`]
})
export class TipoTemplateComponent { }
// templates.component.ts
import { Component } from '@angular/core';
// Agregando Modulo personalizado de tipos de componentes
import { TipoTemplateComponent } from './tipo-templates/tipo-templates.component';
@Component({
selector: 'app-templates',
standalone: true,
// Declarando el modulo agregado
imports: [ TipoTemplateComponent, ],
templateUrl: './templates.component.html',
styleUrl: './templates.component.css'
})
export class TemplatesComponent { }
// app.component.ts
import { Component } from '@angular/core';
import { RouterOutlet } from '@angular/router';
// Importando el componente Personalizado TemplatesComponent,...
import { TemplatesComponent } from './templates/templates.component'
@Component({
selector: 'app-root',
standalone: true,
imports: [RouterOutlet, TemplatesComponent],
templateUrl: './app.component.html',
styleUrl: './app.component.css'
})
export class AppComponent {
title = 'practica2';
}
..