¿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';
}
..
