Primeros pasos¶
Debemos instalar nvm, node, y luego angular/cli de forma global debemos crear el proyecto usando ng
ng g c : path/nombre genera el componente
    usamos -s -t para decir que los styles y template son inline
ng s   : abre el servidor
El objetivo es estar dividiendo todo en componentes.
Para instalar bootstrap¶
npm i  --save bootstrap@latest
en angular.json colocar en styles: los valores del path del modulo
    en mi caso es 
Interpolador¶
EN resumen es inyectar texto dinámico en una plantilla HTML, haciendo uso de selectores como {{ }} lo que este entre las llaves es la variable o expresión lógica a inyectar.
Property Binding¶
usamos el atributo [], ejemplo colocar [disabled]=variable en ts"
Event binding¶
o colocamos entre () los valores del eventjo, ej. (click)="algo"
Two way binding¶
Hace que se comunique tanto hacia la plantilla como el componente, en angular viejo, se debria importar FormsModule, pero en la 18 creo que ya no es necesario, yo lo he importado como un standalone
Primer proyecto, hacer una caulcadora
![[Pasted image 20240918170731.png]]
Directivas¶
NgIf¶
Usamos la directiva @If para ponerlo de manera dinamica el mostrar o no mostrar alog. En versiones anteriores es con *ngIf
Igualmente, tenemos el @else o *else, si se le aplica el *ngIf="condition; else id", se le debe aplicar un #id al div con el que lo vamos a operar.
Ngfor
Usamos @for algo of algo o si es angular anterior, *ngFor let x...
Flujo de datos¶
podemos enviar datos y recibir con @Input y @Output antes del atributo
Podemos usar strictPropertyInitialization: false en el tsconfig.json si queremos que no nos obligue a colocar atributos al inicializar
Referencias locales¶
No usamos two way binding, es una alternativa. colocamos en el input el #ID y hacemos referencia a él de esa forma local mente con ID.
<input ... #input1 >
<input ... #input2 > 
...
<button ... (click) = "function(input1.value, input2.value)">...
Tambien podemos acceder a los valores locales sin llamarlos desde la función de llamado a @ViewChild en el archivo ts, en cuyo caso en el ts accederiamos de esta forma
@ViewChild('nombreRefInput') nombreInput: ElementRef | undefined;
@ViewChild('apellidoRefInput') apellidoInput: ElementRef | undefined;
// agregarPersona(nombre: string, appellido: string): void {
// this.guardarUsuario.emit(new Persona(nombre, appellido));
// }
agregarPersona(): void {
    this.guardarUsuario.emit(
    new Persona(
    this.nombreInput?.nativeElement.value,
    this.apellidoInput?.nativeElement.value
));}
Servicios¶
es una clase de TS que sirve para centralizar información entre componentes, no para almacenar datos. Este servicio debe ser inyectado, puede ser entre plataforma, componentes o algun nombre en especifio, si se coloca como root, se usará el mismo servicio en toda la app.
Data Services¶
Sirven para almacenar datos entre componentes y ser consumida por ellos.
Si queremos inyectar un servicio en otro, es importable poner el decorador @Injecatble()
Comunicacion en componentes¶
- El servicio debe tener un EventEmiter
- un componente debe invocar al servicio.elemento.emit
- otro componente debe suscribirse al servicio- service.ellemento.subscribe({data})
 
Behaviours para esperar al cambio en otro componente.¶
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable({
  providedIn: 'root'
})
export class MiServicio {
  private valorSubject = new BehaviorSubject<string>('valor inicial');
  public valor$ = this.valorSubject.asObservable();
  setValue(nuevoValor: string) {
    this.valorSubject.next(nuevoValor);  // Actualiza el valor y notifica a los suscriptores
  }
}
import { Component, OnInit } from '@angular/core';
import { MiServicio } from './mi-servicio.service';
@Component({
  selector: 'app-mi-componente',
  template: '<p>{{ valor }}</p>'
})
export class MiComponente implements OnInit {
  public valor: string;
  constructor(private miServicio: MiServicio) {}
  ngOnInit(): void {
    // Nos suscribimos al observable para recibir actualizaciones del valor
    this.miServicio.valor$.subscribe(nuevoValor => {
      this.valor = nuevoValor;
    });
  }
}
PIPES¶
Usamos pipes para dar formato a algun texto... simplemente importamos el Pipe y luego lo configuramos segun la ESTR:ESTR2 que se define en la documentacion
estructura
{{ value | currency : "GTQ" : "Q" : "1.0-2" }}
NgClass¶
usamos el selector [ngClass]="{class1:boolean_expression} 
Formularios¶
ngModel y ngForm con el id #ID