← Base de conocimientos de TI Angular · todas las preguntas

Angular: todas las preguntas en una página

Las tres páginas de Angular (Principiante, Intermedio y Avanzado) se fusionaron en un solo documento, además de un conjunto escrito para los bloques de construcción reutilizables del marco: componentes, módulos, servicios, directivas y canalizaciones. 1.120 preguntas y respuestas, numeradas continuamente, con capacidad de búsqueda, con la redacción original traducida y los ejemplos de código sin cambios. La búsqueda salta directamente a una pregunta; los botones filtran por nivel o por tema.

1.120 preguntas Principiante · 280 Intermedio · 340 Avanzado · 377 Bloques reutilizables y práctica · 123 Castellano Angular 13+

principiante 280 preguntas

Conceptos básicos: componentes, servicios, inyección de dependencias, enlaces de ciclo de vida, enlace de datos, directivas estructurales y de atributos, canalizaciones, enrutamiento, formularios, RxJS y CLI. pagina original

Marco angular: conceptos básicos y arquitectura central.

Guía exhaustiva de preguntas y respuestas fundamentales sobre Angular: componentes, servicios, inyección de dependencias, ciclo de vida (lifecycle hooks), enlace de datos (data link), directivas estructurales y de atributos, pipes, enrutamiento (routing), formularios reactivos y template-driven, RxJS observables y Angular CLI.

1. ¿Qué es angular?

Angular es un marco de aplicación web de código abierto basado en TypeScript desarrollado por Google. Se utiliza para crear aplicaciones de una sola página (SPA) con una arquitectura basada en componentes.

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Qué es un componente en Angular?

Un componente es un componente fundamental de las aplicaciones Angular. Consiste en una plantilla HTML, una hoja de estilo CSS y una clase TypeScript que define el comportamiento y los datos del componente.



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



@Component({

    selector: 'app-example',

    template: '<h1>Hello, Angular!</h1>',

    styles: ['h1 { color: blue; }']

})

export class ExampleComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se define un servicio en Angular?

Un servicio en Angular es una clase que proporciona una funcionalidad específica que se puede compartir entre componentes. Los servicios se utilizan para manejar operaciones de datos y lógica empresarial.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    getData() {

        return 'Service Data';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Qué es la CLI angular?

Angular CLI (Command Line Interface) es una herramienta que se utiliza para automatizar el flujo de trabajo de las aplicaciones Angular. Ayuda a crear nuevos proyectos, generar componentes y ejecutar servidores de desarrollo.

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se crea un nuevo componente Angular usando Angular CLI?

Para crear un nuevo componente Angular usando Angular CLI, puede ejecutar el comando:

ng generate component component-name

o

ng g c component-name

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Qué es el enlace de datos en Angular?

El enlace de datos es el mecanismo para sincronizar datos entre el modelo y la vista. Angular admite varios tipos de enlace de datos: interpolación, enlace de propiedad, enlace de eventos y enlace de datos bidireccional.



<input [(ngModel)]="name" />

<p>Hello, {{ name }}!</p>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utilizan las directivas angulares?

Las directivas son clases que agregan comportamiento a elementos en sus aplicaciones Angular. Se utilizan para manipular el DOM o agregar nuevos comportamientos a los elementos.



import { Directive, ElementRef, Renderer2 } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(el: ElementRef, renderer: Renderer2) {

        renderer.setStyle(el.nativeElement, 'backgroundColor', 'yellow');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Para qué se utiliza el enrutador angular?

Angular Router se utiliza para navegar entre diferentes vistas o páginas en una aplicación de una sola página. Permite configuraciones de enrutamiento y parámetros de ruta.

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se define una ruta en Angular?

Las rutas se definen en la configuración `RouterModule`. Cada ruta asigna una ruta a un componente.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home/home.component';

import { AboutComponent } from './about/about.component';



const routes: Routes = [

    { path: '', component: HomeComponent },

    { path: 'about', component: AboutComponent }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Qué son los módulos angulares?

Los módulos angulares son clases que agrupan componentes, servicios, directivas y canalizaciones relacionados. Ayudan a organizar y gestionar la estructura de la aplicación.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Qué es la inyección de dependencia en Angular?

La inyección de dependencia es un patrón de diseño utilizado para implementar IoC (Inversión de Control). En Angular, le permite inyectar servicios y otras dependencias en componentes y servicios.

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `ngModel` para el enlace de datos bidireccional?

`ngModel` se utiliza para el enlace de datos bidireccional. Vincula un elemento de entrada de formulario a una propiedad del componente.



<input [(ngModel)]="name" />

<p>Welcome, {{ name }}!</p>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Qué es una tubería angular?

Una tubería angular es una forma de transformar datos en la plantilla. Las canalizaciones se utilizan para formatear o transformar datos antes de mostrárselos al usuario.



<p>{{ birthday | date:'longDate' }}</p>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utilizan las formas angulares?

Angular admite formularios reactivos y basados en plantillas. Los formularios basados ​​en plantillas usan directivas en la plantilla, mientras que los formularios reactivos usan las clases FormControl y FormGroup.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-form',

    template: `

    <form [formGroup]="formGroup" (ngSubmit)="onSubmit()">

        <input formControlName="name" />

        <button type="submit">Submit</button>

    </form>

    `

})

export class FormComponent {

    formGroup: FormGroup;



    constructor(private fb: FormBuilder) {

        this.formGroup = this.fb.group({

            name: ['']

        });

    }



    onSubmit() {

        console.log(this.formGroup.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Qué es la directiva "ngIf" de Angular?

`ngIf` es una directiva estructural utilizada para incluir o excluir condicionalmente elementos del DOM basándose en una expresión booleana.



<div *ngIf="isVisible">Content to show when isVisible is true</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se pasan datos de un componente principal a un componente secundario en Angular?

Puede pasar datos de un componente principal a un componente secundario utilizando las propiedades @Input.



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



@Component({

    selector: 'app-child',

    template: '<p>{{ data }}</p>'

})

export class ChildComponent {

    @Input() data: string;

}



@Component({

    selector: 'app-parent',

    template: '<app-child [data]="parentData"></app-child>'

})

export class ParentComponent {

    parentData = 'Hello from parent!';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Para qué se utiliza la directiva `ngFor` de Angular?

`ngFor` es una directiva estructural que se utiliza para iterar sobre una lista o matriz y representar una plantilla para cada elemento.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cuál es el propósito del `AppModule` de Angular?

`AppModule` es el módulo raíz de una aplicación Angular. Es responsable de arrancar la aplicación y declarar los componentes, directivas y servicios que pertenecen al módulo.

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se definen las rutas angulares?

Las rutas se definen utilizando `RouterModule` con una variedad de configuraciones de ruta que asignan rutas URL a componentes.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home/home.component';

import { AboutComponent } from './about/about.component';



const routes: Routes = [

    { path: '', component: HomeComponent },

    { path: 'about', component: AboutComponent }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Qué son los ganchos del ciclo de vida de Angular?

Los ganchos del ciclo de vida son métodos que le permiten aprovechar momentos clave en el ciclo de vida de un componente o directiva, como la inicialización y la destrucción.



import { Component, OnInit, OnDestroy } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>'

})

export class ExampleComponent implements OnInit, OnDestroy {

    ngOnInit() {

        console.log('Component initialized');

    }



    ngOnDestroy() {

        console.log('Component destroyed');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares básicas - Parte 2

21. ¿Para qué se utiliza la directiva `ngClass` de Angular?

`ngClass` se utiliza para agregar o eliminar dinámicamente clases CSS a elementos en función de la evaluación de expresiones.



<div [ngClass]="{'active': isActive, 'inactive': !isActive}">Content</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

22. ¿Cómo se utiliza la directiva `ngSwitch` de Angular?

`ngSwitch` se usa para mostrar condicionalmente uno de muchos elementos según el valor de una expresión.



<div [ngSwitch]="currentColor">

    <div *ngSwitchCase="'red'">Red</div>

    <div *ngSwitchCase="'blue'">Blue</div>

    <div *ngSwitchDefault>Default</div>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

23. ¿Para qué se utiliza `ngForTrackBy` de Angular?

`ngForTrackBy` ayuda a Angular a rastrear qué elementos han cambiado, se han agregado o se han eliminado proporcionando un identificador único para cada elemento de la lista.



<div *ngFor="let item de items; trackBy: trackById">

    {{ item.name }}

</div>



trackById(index: number, item: any): number {

    return item.id;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

24. ¿Cómo se usa `ngIf` de Angular con `else`?

`ngIf` se puede usar con `else` para proporcionar una plantilla alternativa cuando la condición es falsa.



<div *ngIf="isVisible; else notVisible">

    Content to show when isVisible is true

</div>

<ng-template #notVisible>

    Content to show when isVisible is false

</ng-template>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

25. ¿Para qué se utiliza el `FormBuilder` de Angular?

`FormBuilder` es un servicio utilizado para crear y administrar formularios reactivos en Angular. Simplifica la creación de instancias `FormGroup` y `FormControl`.



import { FormBuilder, FormGroup } from '@angular/forms';



constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

        name: [''],

        email: ['']

    });

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

26. ¿Cuál es el propósito del decorador `@Injectable` de Angular?

El decorador `@Injectable` se utiliza para marcar una clase como disponible para la inyección de dependencia. Le dice a Angular que la clase se puede inyectar en otras clases como una dependencia.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

27. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular?

`@Input` se usa para pasar datos de un componente principal a un componente secundario, mientras que `@Output` se usa para emitir eventos desde el componente secundario al principal.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: '<button (click)="sendEvent()">Click me</button>'

})

export class ChildComponent {

    @Input() data: string;

    @Output() event = new EventEmitter<string>();



    sendEvent() {

        this.event.emit('Event data');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

28. ¿Qué es el "AppComponent" angular?

`AppComponent` suele ser el componente raíz de una aplicación Angular. Sirve como punto de entrada principal para la aplicación y activa otros componentes.



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



@Component({

    selector: 'app-root',

    template: '<h1>Welcome to Angular!</h1>',

    styles: ['h1 { color: red; }']

})

export class AppComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

29. ¿Cómo se maneja la entrada del usuario en formularios angulares?

Puede manejar la entrada del usuario mediante formularios basados en plantillas o formularios reactivos. Los formularios basados ​​en plantillas usan directivas en la plantilla, mientras que los formularios reactivos usan controles y grupos de formulario en la clase de componente.



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

import { FormGroup, FormBuilder } from '@angular/forms';



@Component({

    selector: 'app-form',

    template: `

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

        <input formControlName="name" />

        <button type="submit">Submit</button>

    </form>

    `

})

export class FormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['']

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

30. ¿Para qué se utiliza el decorador `@NgModule` de Angular?

El decorador `@NgModule` define un módulo Angular, incluidos los componentes, directivas y canalizaciones que contiene, así como otros módulos de los que depende.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

31. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP?

`HttpClient` se utiliza para realizar solicitudes HTTP a un servidor. Proporciona métodos como "get", "post", "put" y "delete" para manejar operaciones HTTP.



import { HttpClient } from '@angular/common/http';

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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    constructor(private http: HttpClient) {}



    getData() {

        return this.http.get('https://api.example.com/data');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

32. ¿Qué es el "RouterModule" de Angular?

`RouterModule` es un módulo Angular que proporciona funcionalidad de enrutamiento y navegación para aplicaciones Angular. Ayuda a definir rutas y configurar la navegación.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home/home.component';

import { AboutComponent } from './about/about.component';



const routes: Routes = [

    { path: '', component: HomeComponent },

    { path: 'about', component: AboutComponent }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

33. ¿Qué son los decoradores angulares?

Los decoradores son funciones que agregan metadatos a clases, métodos o propiedades. Angular usa decoradores para definir componentes, directivas, módulos y servicios.



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



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>'

})

export class ExampleComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

34. ¿Para qué se utiliza el decorador `@ViewChild` de Angular?

El decorador `@ViewChild` se utiliza para acceder a un componente secundario, directiva o elemento DOM de la clase del componente principal.



import { Component, ViewChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '<input #inputElement />'

})

export class ExampleComponent {

    @ViewChild('inputElement') input: ElementRef;



    ngAfterViewInit() {

        this.input.nativeElement.focus();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

35. ¿Cómo se crea una directiva Angular personalizada?

Se crea una directiva personalizada utilizando el decorador `@Directive`. Se puede utilizar para agregar comportamiento a elementos o componentes.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) {}



    @HostListener('mouseenter') onMouseEnter() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'white');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

36. ¿Qué es la "Estrategia de detección de cambios" de Angular?

`ChangeDetectionStrategy` determina cómo Angular busca cambios en el componente. Las dos estrategias son "Default" y "OnPush".



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



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>',

    changeDetection: ChangeDetectionStrategy.OnPush

})

export class ExampleComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

37. ¿Cómo se utiliza `ngModel` de Angular para el enlace de datos bidireccional?

`ngModel` se utiliza para el enlace de datos bidireccional entre el modelo y la vista. Vincula un control de formulario a una propiedad en la clase de componente.



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



@Component({

    selector: 'app-example',

    template: '<input [(ngModel)]="name" /> <p>Hello {{ name }}</p>'

})

export class ExampleComponent {

    name: string = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

38. ¿Para qué se utiliza el decorador `@HostBinding` de Angular?

El decorador `@HostBinding` vincula una propiedad o atributo del elemento host de una directiva o componente a una propiedad de la directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('class.highlight') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

39. ¿Para qué se utiliza el `ng-content` de Angular?

`ng-content` se utiliza para proyectar contenido en un componente desde su componente principal. Le permite crear componentes reutilizables con contenido personalizable.



@Component({

    selector: 'app-card',

    template: '<ng-content></ng-content>'

})

export class CardComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

40. ¿Cómo se utiliza el servicio `Router` de Angular para navegar mediante programación?

Puede utilizar el servicio `Router` para navegar a diferentes rutas mediante programación llamando a su método `navigate`.



import { Router } from '@angular/router';



constructor(private router: Router) {}



navigateToHome() {

    this.router.navigate(['/home']);

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares básicas - Parte 3

41. ¿Cuál es el propósito del gancho del ciclo de vida `ngOnInit` de Angular?

El gancho del ciclo de vida `ngOnInit` se llama después de que se hayan inicializado las propiedades vinculadas a datos del componente. Se usa comúnmente para la lógica de inicialización.



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



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>'

})

export class ExampleComponent implements OnInit {

    ngOnInit() {

        console.log('Component initialized');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

42. ¿Cómo se define un servicio Angular?

Un servicio Angular se define utilizando el decorador `@Injectable`. Es una clase que se puede inyectar en otros componentes o servicios.



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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    getData() {

        return ['data1', 'data2'];

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

43. ¿Cuál es el propósito del decorador `@Directive` de Angular?

El decorador `@Directive` se utiliza para crear directivas personalizadas en Angular. Las directivas pueden cambiar la apariencia o el comportamiento de elementos en el DOM.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) {}



    @HostListener('mouseenter') onMouseEnter() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'transparent');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

44. ¿Cómo se crea un módulo Angular?

Se crea un módulo Angular utilizando el decorador `@NgModule`. Define un módulo que agrupa componentes, directivas, canalizaciones y servicios.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

45. ¿Qué es la directiva `ngIf` de Angular?

`ngIf` es una directiva estructural que incluye o elimina condicionalmente un elemento del DOM en función de la veracidad de una expresión.



<div *ngIf="isVisible">This is visible</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

46. ¿Cómo se utiliza la directiva `ngFor` de Angular?

`ngFor` es una directiva estructural que se utiliza para repetir un bloque de HTML para cada elemento de una lista.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

47. ¿Qué es el decorador `@Component` de Angular?

El decorador `@Component` se utiliza para definir un componente en Angular. Especifica el selector, la plantilla y los estilos del componente.



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



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>',

    styles: ['p { color: blue; }']

})

export class ExampleComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

48. ¿Cómo se implementa la inyección de dependencia de Angular?

La inyección de dependencia en Angular se implementa proporcionando servicios en la matriz de "proveedores" del componente o módulo e inyectándolos en el constructor de la clase.



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

import { DataService } from './data.service';



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>'

})

export class ExampleComponent {

    constructor(private dataService: DataService) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

49. ¿Para qué se utiliza el decorador `@Pipe` de Angular?

El decorador `@Pipe` se utiliza para definir canalizaciones personalizadas en Angular, que transforman datos en plantillas.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'customPipe'

})

export class CustomPipe implements PipeTransform {

    transform(value: string): string {

        return value.toUpperCase();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

50. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnChanges` de Angular?

El gancho del ciclo de vida `ngOnChanges` se llama cuando cambia una propiedad de entrada del componente. Se utiliza para realizar acciones basadas en los cambios de propiedad de entrada.



import { Component, OnChanges, SimpleChanges, Input } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>'

})

export class ExampleComponent implements OnChanges {

    @Input() data: string;



    ngOnChanges(changes: SimpleChanges) {

        console.log('Changes detected:', changes);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

51. ¿Qué es la directiva `ngModel` de Angular?

`ngModel` es una directiva utilizada para el enlace de datos bidireccional entre los controles del formulario y las propiedades del componente.

<input [(ngModel)]="name" />

<p>Hello {{ name }}</p>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

52. ¿Cómo se crea un formulario reactivo en Angular?

Los formularios reactivos se crean usando las clases `FormGroup` y `FormControl` de `@angular/forms`.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-form',

    template: `

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

        <input formControlName="name" />

        <button type="submit">Submit</button>

    </form>

    `

})

export class FormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['']

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

53. ¿Para qué se utiliza el decorador `@HostListener` de Angular?

El decorador `@HostListener` se utiliza para escuchar eventos en el elemento host de la directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appEvent]'

})

export class EventDirective {

    @HostListener('click', ['$event']) onClick(event: Event) {

        console.log('Element clicked:', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

54. ¿Cómo se utiliza el decorador `@Input` de Angular?

El decorador `@Input` se utiliza para pasar datos de un componente principal a un componente secundario.



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



@Component({

    selector: 'app-child',

    template: '<p>{{ data }}</p>'

})

export class ChildComponent {

    @Input() data: string;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

55. ¿Para qué se utiliza el decorador `@Output` de Angular?

El decorador `@Output` se utiliza para emitir eventos de un componente secundario a un componente principal.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: '<button (click)="sendData()">Send Data</button>'

})

export class ChildComponent {

    @Output() dataSent = new EventEmitter<string>();



    sendData() {

        this.dataSent.emit('Some data');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

56. ¿Cómo se manejan las solicitudes HTTP en Angular?

Las solicitudes HTTP en Angular se manejan mediante el servicio `HttpClient` de `@angular/common/http`.



import { HttpClient } from '@angular/common/http';

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



@Component({

    selector: 'app-http',

    template: '<p>HTTP request component</p>'

})

export class HttpComponent {

    constructor(private http: HttpClient) {}



    getData() {

        this.http.get('https://api.example.com/data').subscribe(response => {

            console.log(response);

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

57. ¿Para qué se utiliza el `RouterModule` de Angular?

El `RouterModule` se utiliza para configurar rutas en una aplicación Angular, permitiendo la navegación entre diferentes vistas o componentes.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';

import { AboutComponent } from './about.component';



const routes: Routes = [

    { path: 'home', component: HomeComponent },

    { path: 'about', component: AboutComponent },

    { path: '', redirectTo: '/home', pathMatch: 'full' }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

58. ¿Cómo se utiliza el decorador `@Injectable` de Angular en un servicio?

El decorador `@Injectable` se utiliza para definir un servicio que se puede inyectar en otros componentes o servicios.



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



@Injectable({

    providedIn: 'root'

})

export class UserService {

    getUser() {

        return { name: 'John Doe' };

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

59. ¿Para qué se utiliza la propiedad `@NgModule` de metadatos `imports` de Angular?

La propiedad `imports` en `@NgModule` se usa para importar otros módulos Angular al módulo actual, haciendo que sus componentes, directivas y canalizaciones estén disponibles para su uso.



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

import { CommonModule } from '@angular/common';

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



@NgModule({

    imports: [CommonModule, FormsModule],

    declarations: [MyComponent]

})

export class MyModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

60. ¿Cómo se utiliza el decorador `@HostBinding` de Angular?

El decorador `@HostBinding` se utiliza para vincular una propiedad o atributo del elemento host a una propiedad de la directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appColor]'

})

export class ColorDirective {

    @HostBinding('style.color') color: string = 'blue';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares básicas - Parte 4

61. ¿Para qué se utiliza el decorador `@ViewChild` de Angular?

El decorador `@ViewChild` se utiliza para acceder a un componente secundario, directiva o elemento DOM dentro de la plantilla del componente.



import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '<input #myInput />'

})

export class ExampleComponent implements AfterViewInit {

    @ViewChild('myInput') input: ElementRef;



    ngAfterViewInit() {

        this.input.nativeElement.focus();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

62. ¿Cómo se definen rutas angulares con parámetros?

Las rutas angulares con parámetros se definen usando dos puntos `:` seguidos del nombre del parámetro en la ruta de la ruta.



const routes: Routes = [

    { path: 'user/:id', component: UserComponent }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

63. ¿Para qué se utiliza la directiva `ngSwitch` de Angular?

La directiva `ngSwitch` se utiliza para incluir o excluir condicionalmente elementos del DOM en función de una expresión de cambio.



<div [ngSwitch]="value">

    <p *ngSwitchCase="'case1'">Case 1</p>

    <p *ngSwitchCase="'case2'">Case 2</p>

    <p *ngSwitchDefault>Default case</p>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

64. ¿Cómo se utiliza la directiva `ngStyle` de Angular?

La directiva `ngStyle` se utiliza para aplicar estilos en línea a elementos según los valores de una expresión.



<div [ngStyle]="{'color': color, 'font-size.px': fontSize}">

    Styled text

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

65. ¿Qué es el elemento `ngContainer` de Angular?

`ngContainer` es una directiva estructural que le permite agrupar elementos sin agregar elementos adicionales al DOM.

<ng-container *ngIf="isVisible">

    </ng-container><ng-container *ngIf="isVisible"><p>Content is visible</p>

</ng-container>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

66. ¿Cómo defines los guardias de ruta de Angular?

Los guardias de ruta se utilizan para controlar el acceso a las rutas. Implementan las interfaces `CanActivate`, `CanDeactivate`, `CanLoad` o `Resolve`.



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

import { CanActivate, Router } from '@angular/router';



@Injectable({

    providedIn: 'root'

})

export class AuthGuard implements CanActivate {

    constructor(private router: Router) {}



    canActivate(): boolean {

        // Implement authentication check

        return true; // or false if not authenticated

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

67. ¿Para qué se utiliza el decorador `@HostBinding` de Angular?

El decorador `@HostBinding` se utiliza para vincular una propiedad o atributo del elemento host a una propiedad de la directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('class.highlight') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

68. ¿Cómo se realiza la validación de formularios en los formularios reactivos de Angular?

La validación de formularios en formularios reactivos se realiza mediante validadores como `Validators.required`, `Validators.minLength`, etc.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-form',

    template: `

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

        <input formControlName="name" />

        <div *ngIf="form.get('name').invalid && form.get('name').touched">

            Name is required

        </div>

        <button type="submit">Submit</button>

    </form>

    `

})

export class FormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['', Validators.required]

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

69. ¿Para qué se utiliza la propiedad `@NgModule` de metadatos `declaraciones` de Angular?

La propiedad `declaraciones` en `@NgModule` se usa para declarar los componentes, directivas y canalizaciones que pertenecen al módulo.



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

import { CommonModule } from '@angular/common';

import { MyComponent } from './my.component';



@NgModule({

    declarations: [MyComponent],

    imports: [CommonModule],

    exports: [MyComponent]

})

export class MyModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

70. ¿Cómo se utiliza la directiva `ngModel` de Angular para el enlace de datos bidireccional?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional vinculando controles de formulario a las propiedades del componente.

<input [(ngModel)]="name" />

<p>Hello {{ name }}</p>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

71. ¿Para qué se utiliza el decorador `@Injectable` de Angular en los servicios?

El decorador `@Injectable` se utiliza para marcar una clase como disponible para ser proporcionada e inyectada como una dependencia en otros componentes o servicios.



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



@Injectable({

    providedIn: 'root'

})

export class MyService {

    getData() {

        return 'Service data';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

72. ¿Cómo se manejan los errores HTTP en Angular usando `HttpClient`?

Los errores HTTP se pueden manejar usando el operador `catchError` de `rxjs` para detectar y manejar errores de solicitudes HTTP.



import { HttpClient } from '@angular/common/http';

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

import { catchError } from 'rxjs/operators';

import { de } from 'rxjs';



@Injectable({

    providedIn: 'root'

})

export class DataService {

    constructor(private http: HttpClient) {}



    getData() {

        return this.http.get('https://api.example.com/data').pipe(

            catchError(error => {

                console.error('Error occurred', error);

                return of([]);

            })

        );

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

73. ¿Para qué se utiliza la propiedad `@NgModule` de metadatos `proveedores` de Angular?

La propiedad `proveedores` en `@NgModule` se usa para definir los servicios que estarán disponibles para la inyección de dependencia dentro del módulo.



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

import { MyService } from './my.service';



@NgModule({

    providers: [MyService]

})

export class MyModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

74. ¿Cómo se utiliza la directiva `*ngFor` de Angular?

La directiva `*ngFor` se utiliza para iterar sobre una lista y crear una plantilla para cada elemento de la lista.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

75. ¿Cómo se utiliza la directiva `ngIf` de Angular?

La directiva `ngIf` se utiliza para incluir o excluir condicionalmente elementos del DOM en función de una expresión.



<div *ngIf="isVisible">

    Content is visible

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

76. ¿Para qué se utiliza el decorador `@Input` de Angular?

El decorador `@Input` se utiliza para pasar datos de un componente principal a un componente secundario.



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



@Component({

    selector: 'app-child',

    template: '<p>{{ data }}</p>'

})

export class ChildComponent {

    @Input() data: string;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

77. ¿Cuál es el papel del `AppComponent` en una aplicación Angular?

El `AppComponent` es el componente raíz de la aplicación Angular y sirve como punto de entrada para el árbol de componentes.



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



@Component({

    selector: 'app-root',

    template: '<h1>Welcome to Angular!</h1>'

})

export class AppComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

78. ¿Cómo se crea una directiva Angular personalizada?

Las directivas personalizadas se crean utilizando el decorador `@Directive` para definir una clase que se aplicará a los elementos.



import { Directive, ElementRef, Renderer2 } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

79. ¿Para qué se utiliza el gancho del ciclo de vida `ngOnInit` de Angular?

El enlace del ciclo de vida `ngOnInit` se utiliza para la lógica de inicialización que debe realizarse después de que se hayan inicializado las propiedades vinculadas a datos del componente.



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



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>'

})

export class ExampleComponent implements OnInit {

    ngOnInit() {

        console.log('Component initialized');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

80. ¿Cómo se maneja la entrada del usuario con formularios angulares?

La entrada del usuario se maneja mediante formularios angulares, que pueden ser formularios reactivos o basados en plantillas.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-login',

    template: `

    <form [formGroup]="loginForm" (ngSubmit)="onSubmit()">

        <input formControlName="username" />

        <input formControlName="password" type="password" />

        <button type="submit">Login</button>

    </form>

    `

})

export class LoginComponent {

    loginForm: FormGroup;



    constructor(private fb: FormBuilder) {

        this.loginForm = this.fb.group({

            username: ['', Validators.required],

            password: ['', Validators.required]

        });

    }



    onSubmit() {

        console.log(this.loginForm.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares básicas - Parte 5

81. ¿Para qué se utiliza la directiva `ngModel` de Angular?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional entre los campos de entrada del formulario y las propiedades del componente.

<input [(ngModel)]="name" />

<p>Hello {{ name }}</p>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

82. ¿Cómo se define una tubería angular personalizada?

Una tubería personalizada se define utilizando el decorador `@Pipe` e implementando la interfaz `PipeTransform`.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

83. ¿Para qué se utiliza la directiva `ngFor` de Angular?

La directiva `ngFor` se utiliza para repetir una plantilla para cada elemento de una lista o matriz.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

84. ¿Cómo se utiliza la directiva `ngClass` de Angular?

La directiva `ngClass` se utiliza para agregar o eliminar dinámicamente clases CSS según la expresión.



<div [ngClass]="{ 'highlight': isHighlighted, 'bold': isBold }">

    Styled text

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

85. ¿Cuál es el propósito del decorador `@Output` de Angular?

El decorador `@Output` se utiliza para definir un evento que un componente secundario puede emitir a su componente principal.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="sendMessage()">Send</button>`

})

export class ChildComponent {

    @Output() message = new EventEmitter<string>();



    sendMessage() {

        this.message.emit('Hello from child');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

86. ¿Cómo se vincula una propiedad de componente Angular a un atributo de elemento HTML?

Puede vincular una propiedad de componente a un atributo de elemento HTML utilizando la sintaxis de vinculación de propiedad con corchetes.



<img [src]="imageUrl" />

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

87. ¿Cuál es el propósito de la directiva "ngIf" de Angular?

La directiva `ngIf` se utiliza para incluir o excluir condicionalmente elementos del DOM basándose en una expresión booleana.



<div *ngIf="isVisible">Content is visible</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

88. ¿Cómo se utiliza el decorador `@ViewChild` de Angular para acceder a un componente secundario?

El decorador `@ViewChild` se utiliza para acceder a un componente o elemento secundario dentro de la plantilla del componente.



import { Component, ViewChild, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<app-child></app-child>`

})

export class ParentComponent implements AfterViewInit {

    @ViewChild(ChildComponent) child: ChildComponent;



    ngAfterViewInit() {

        console.log(this.child);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

89. ¿Para qué se utiliza el decorador `@Injectable` de Angular?

El decorador `@Injectable` se utiliza para marcar una clase como disponible para la inyección de dependencia.



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



@Injectable({

    providedIn: 'root'

})

export class MyService {

    getValue() {

        return 'Service value';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

90. ¿Cómo se crea un formulario reactivo en Angular?

Los formularios reactivos se crean utilizando el servicio `FormBuilder` para construir el modelo de formulario y sus controles.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

        <input formControlName="name" />

        <button type="submit">Submit</button>

    </form>

    `

})

export class ReactiveFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['', Validators.required]

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

91. ¿Cuál es la función del archivo `app.module.ts` en una aplicación Angular?

El archivo `app.module.ts` define el módulo raíz de la aplicación, incluidos los componentes, directivas, canalizaciones y servicios que se utilizan en toda la aplicación.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

92. ¿Cómo manejas los eventos en Angular?

Los eventos se manejan utilizando la sintaxis de enlace de eventos de Angular, con paréntesis alrededor del nombre del evento.



<button (click)="handleClick()">Click me</button>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

93. ¿Cómo se utiliza la directiva `ngSwitch` de Angular?

La directiva `ngSwitch` se utiliza para mostrar elementos condicionalmente según el valor de una expresión.



<div [ngSwitch]="value">

    <p *ngSwitchCase="'case1'">Case 1</p>

    <p *ngSwitchCase="'case2'">Case 2</p>

    <p *ngSwitchDefault>Default case</p>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

94. ¿Cómo se definen las rutas angulares con rutas secundarias?

Las rutas secundarias se definen dentro de la propiedad `children` de un objeto de configuración de ruta.



const routes: Routes = [

    { path: 'parent', component: ParentComponent, children: [

        { path: 'child', component: ChildComponent }

    ]}

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

95. ¿Para qué se utiliza el gancho del ciclo de vida `ngOnChanges` de Angular?

El gancho del ciclo de vida `ngOnChanges` se utiliza para responder a cambios en las propiedades de entrada del componente.



import { Component, OnChanges, SimpleChanges, Input } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '<p>{{ value }}</p>'

})

export class ExampleComponent implements OnChanges {

    @Input() value: string;



    ngOnChanges(changes: SimpleChanges) {

        console.log('Changes:', changes);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

96. ¿Cómo se crea un servicio en Angular y se proporciona en el inyector raíz?

Se puede crear un servicio usando el decorador `@Injectable` con la opción `providedIn: 'root'` para que esté disponible en toda la aplicación.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    getData() {

        return 'Some data';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

97. ¿Cómo se utiliza la directiva `ngStyle` de Angular para aplicar estilos dinámicamente?

La directiva `ngStyle` se utiliza para aplicar estilos dinámicamente basados en una expresión.



<div [ngStyle]="{ 'color': color, 'font-size': fontSize }">

    Styled text

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

98. ¿Para qué se utiliza el decorador `@HostListener` de Angular?

El decorador `@HostListener` se utiliza para escuchar eventos en el elemento host de la directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appHover]'

})

export class HoverDirective {

    @HostListener('mouseenter') onMouseEnter() {

        console.log('Mouse entered');

    }



    @HostListener('mouseleave') onMouseLeave() {

        console.log('Mouse left');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

99. ¿Cómo se manejan las solicitudes HTTP en Angular?

Las solicitudes HTTP se manejan utilizando el servicio `HttpClient` proporcionado por el módulo `@angular/common/http`.



import { HttpClient } from '@angular/common/http';

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



@Component({

    selector: 'app-http',

    template: '<p>Check console for HTTP request result</p>'

})

export class HttpComponent {

    constructor(private http: HttpClient) {

        this.http.get('https://api.example.com/data')

            .subscribe(data => console.log(data));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

100. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnDestroy` de Angular?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para limpiar recursos y cancelar la suscripción a observables cuando se destruye un componente.



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

import { Subscription } from 'rxjs';



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>'

})

export class ExampleComponent implements OnDestroy {

    private subscription: Subscription;



    constructor() {

        this.subscription = // ... initialize subscription

    }



    ngOnDestroy() {

        this.subscription.unsubscribe();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares básicas - Parte 6

101. ¿Para qué se utiliza la directiva `ngModel` de Angular?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional entre los campos de entrada del formulario y las propiedades del componente.

<input [(ngModel)]="name" />

<p>Hello {{ name }}</p>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

102. ¿Cómo se define una tubería angular personalizada?

Una tubería personalizada se define utilizando el decorador `@Pipe` e implementando la interfaz `PipeTransform`.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

103. ¿Para qué se utiliza la directiva `ngFor` de Angular?

La directiva `ngFor` se utiliza para repetir una plantilla para cada elemento de una lista o matriz.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

104. ¿Cómo se utiliza la directiva `ngClass` de Angular?

La directiva `ngClass` se utiliza para agregar o eliminar dinámicamente clases CSS según la expresión.



<div [ngClass]="{ 'highlight': isHighlighted, 'bold': isBold }">

    Styled text

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

105. ¿Cuál es el propósito del decorador `@Output` de Angular?

El decorador `@Output` se utiliza para definir un evento que un componente secundario puede emitir a su componente principal.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="sendMessage()">Send</button>`

})

export class ChildComponent {

    @Output() message = new EventEmitter<string>();



    sendMessage() {

        this.message.emit('Hello from child');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

106. ¿Cómo se vincula una propiedad de componente Angular a un atributo de elemento HTML?

Puede vincular una propiedad de componente a un atributo de elemento HTML utilizando la sintaxis de vinculación de propiedad con corchetes.



<img alt="" [src]="imageUrl" />

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

107. ¿Cuál es el propósito de la directiva "ngIf" de Angular?

La directiva `ngIf` se utiliza para incluir o excluir condicionalmente elementos del DOM basándose en una expresión booleana.



<div *ngIf="isVisible">Content is visible</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

108. ¿Cómo se utiliza el decorador `@ViewChild` de Angular para acceder a un componente secundario?

El decorador `@ViewChild` se utiliza para acceder a un componente o elemento secundario dentro de la plantilla del componente.



import { Component, ViewChild, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<app-child></app-child>`

})

export class ParentComponent implements AfterViewInit {

    @ViewChild(ChildComponent) child: ChildComponent;



    ngAfterViewInit() {

        console.log(this.child);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

109. ¿Para qué se utiliza el decorador `@Injectable` de Angular?

El decorador `@Injectable` se utiliza para marcar una clase como disponible para la inyección de dependencia.



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



@Injectable({

    providedIn: 'root'

})

export class MyService {

    getValue() {

        return 'Service value';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

110. ¿Cómo se crea un formulario reactivo en Angular?

Los formularios reactivos se crean utilizando el servicio `FormBuilder` para construir el modelo de formulario y sus controles.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

        <input formControlName="name" />

        <button type="submit">Submit</button>

    </form>

    `

})

export class ReactiveFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['', Validators.required]

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

111. ¿Cuál es la función del archivo `app.module.ts` en una aplicación Angular?

El archivo `app.module.ts` define el módulo raíz de la aplicación, incluidos los componentes, directivas, canalizaciones y servicios que se utilizan en toda la aplicación.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

112. ¿Cómo manejas los eventos en Angular?

Los eventos se manejan utilizando la sintaxis de enlace de eventos de Angular, con paréntesis alrededor del nombre del evento.



<button (click)="handleClick()">Click me</button>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

113. ¿Cómo se utiliza la directiva `ngSwitch` de Angular?

La directiva `ngSwitch` se utiliza para mostrar elementos condicionalmente según el valor de una expresión.



<div [ngSwitch]="value">

    <p *ngSwitchCase="'case1'">Case 1</p>

    <p *ngSwitchCase="'case2'">Case 2</p>

    <p *ngSwitchDefault>Default case</p>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

114. ¿Cómo se definen las rutas angulares con rutas secundarias?

Las rutas secundarias se definen dentro de la propiedad `children` de un objeto de configuración de ruta.



const routes: Routes = [

    { path: 'parent', component: ParentComponent, children: [

        { path: 'child', component: ChildComponent }

    ]}

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

115. ¿Para qué se utiliza el gancho del ciclo de vida `@OnChanges` de Angular?

El gancho del ciclo de vida `ngOnChanges` se utiliza para responder a cambios en las propiedades de entrada del componente.



import { Component, OnChanges, SimpleChanges, Input } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '<p>{{ value }}</p>'

})

export class ExampleComponent implements OnChanges {

    @Input() value: string;



    ngOnChanges(changes: SimpleChanges) {

        console.log('Changes:', changes);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

116. ¿Cómo se crea un servicio en Angular y se proporciona en el inyector raíz?

Se puede crear un servicio usando el decorador `@Injectable` con la opción `providedIn: 'root'` para que esté disponible en toda la aplicación.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    getData() {

        return 'Some data';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

117. ¿Cómo se utiliza la directiva `ngStyle` de Angular para aplicar estilos dinámicamente?

La directiva `ngStyle` se utiliza para aplicar estilos dinámicamente basados en una expresión.



<div [ngStyle]="{ 'color': color, 'font-size': fontSize }">

    Styled text

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

118. ¿Para qué se utiliza el decorador `@HostListener` de Angular?

El decorador `@HostListener` se utiliza para escuchar eventos en el elemento host de la directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appHover]'

})

export class HoverDirective {

    @HostListener('mouseenter') onMouseEnter() {

        console.log('Mouse entered');

    }



    @HostListener('mouseleave') onMouseLeave() {

        console.log('Mouse left');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

119. ¿Cómo se manejan las solicitudes HTTP en Angular?

Las solicitudes HTTP se manejan utilizando el servicio `HttpClient` proporcionado por el módulo `@angular/common/http`.



import { HttpClient } from '@angular/common/http';

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



@Component({

    selector: 'app-http',

    template: '<p>Check console for HTTP request result</p>'

})

export class HttpComponent {

    constructor(private http: HttpClient) {

        this.http.get('https://api.example.com/data')

            .subscribe(data => console.log(data));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

120. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnDestroy` de Angular?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para limpiar recursos y cancelar la suscripción a observables cuando se destruye un componente.



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

import { Subscription } from 'rxjs';



@Component({

    selector: 'app-example',

    template: '<p>Example component</p>'

})

export class ExampleComponent implements OnDestroy {

    private subscription: Subscription;



    constructor() {

        this.subscription = // ... initialize subscription

    }



    ngOnDestroy() {

        this.subscription.unsubscribe();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares básicas - Parte 8

121. ¿Cuál es el propósito del gancho del ciclo de vida `ngOnInit`?

El enlace del ciclo de vida `ngOnInit` se utiliza para la inicialización de componentes, incluida la recuperación de datos y la configuración de propiedades del componente.



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



@Component({

    selector: 'app-example',

    template: '<p>{{ message }}</p>'

})

export class ExampleComponent implements OnInit {

    message: string;



    ngOnInit() {

        this.message = 'Component initialized';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

122. ¿Cómo se utiliza `ngModel` de Angular con formularios?

La directiva `ngModel` vincula los valores de control de formulario a las propiedades de los componentes, lo que admite el enlace de datos bidireccional en los formularios.



<form>

    <input [(ngModel)]="username" name="username" />

    <p>Your username is: {{ username }}</p>

</form>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

123. ¿Cómo se define y utiliza un servicio en Angular?

Un servicio se define con el decorador `@Injectable` y se puede inyectar en componentes u otros servicios.



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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    getData() {

        return ['Item 1', 'Item 2'];

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

124. ¿Cómo se configura el enrutamiento angular?

El enrutamiento se configura utilizando el método `RouterModule.forRoot`, que proporciona definiciones de ruta en el módulo de la aplicación.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';

import { AboutComponent } from './about.component';



const routes: Routes = [

    { path: '', component: HomeComponent },

    { path: 'about', component: AboutComponent }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

125. ¿Cómo se implementa la validación de entrada en formularios angulares?

La validación se implementa utilizando los validadores integrados de Angular o validadores personalizados en los controles de formulario.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-validation-form',

    template: `

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

        <input formControlName="email" placeholder="Email" />

        <div *ngIf="form.get('email').invalid && form.get('email').touched">

            <p>Email is required and must be valid</p>

        </div>

        <button type="submit">Submit</button>

    </form>

    `

})

export class ValidationFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            email: ['', [Validators.required, Validators.email]]

        });

    }





    onSubmit() {

        if (this.form.valid) {

            console.log(this.form.value);

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

126. ¿Cómo se utiliza la directiva `ngFor` de Angular con objetos?

Cuando usa `ngFor` con objetos, puede iterar sobre las claves del objeto usando la canalización `keyvalue`.



<ul>

    <li *ngFor="let item de object | keyvalue">{{ item.key }}: {{ item.value }}</li>

</ul>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

127. ¿Cuál es el propósito del gancho del ciclo de vida `ngAfterViewInit`?

El gancho del ciclo de vida `ngAfterViewInit` se utiliza para realizar acciones después de que Angular inicializa la vista del componente y las vistas secundarias.



import { Component, AfterViewInit, ViewChild } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<app-child></app-child>`

})

export class ParentComponent implements AfterViewInit {

    @ViewChild(ChildComponent) child: ChildComponent;



    ngAfterViewInit() {

        console.log('Child component:', this.child);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

128. ¿Cómo se configuran dinámicamente estilos CSS en Angular?

Puede configurar dinámicamente estilos CSS usando la directiva `[ngStyle]` de Angular.



<div [ngStyle]="{ 'color': color, 'font-size': fontSize }">

    Dynamic style content

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

129. ¿Cómo se crea un módulo en Angular?

Un módulo se crea utilizando el decorador `@NgModule` y puede incluir declaraciones, importaciones, proveedores y componentes de arranque.



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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';



@NgModule({

    declarations: [FeatureComponent],

    imports: [CommonModule],

    exports: [FeatureComponent]

})

export class FeatureModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

130. ¿Cómo se utiliza la directiva `ngSwitch` de Angular?

La directiva `ngSwitch` le permite mostrar elementos basados en un valor coincidente.



<div [ngSwitch]="value">

    <div *ngSwitchCase="'case1'">Case 1</div>

    <div *ngSwitchCase="'case2'">Case 2</div>

    <div *ngSwitchDefault>Default case</div>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

131. ¿Cómo se manejan las solicitudes HTTP en Angular?

Las solicitudes HTTP se manejan mediante el servicio "HttpClient" de Angular.



import { HttpClient } from '@angular/common/http';

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



@Component({

    selector: 'app-http',

    template: '<p>Data: {{ data }}</p>'

})

export class HttpComponent {

    data: any;



    constructor(private http: HttpClient) {

        this.http.get('https://api.example.com/data')

            .subscribe(response => this.data = response);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

132. ¿Cuál es el propósito del decorador `@Input`?

El decorador `@Input` se utiliza para definir propiedades que pueden recibir datos de un componente principal.



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



@Component({

    selector: 'app-child',

    template: '<p>{{ data }}</p>'

})

export class ChildComponent {

    @Input() data: string;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

133. ¿Cómo se utiliza la directiva `ngClass` de Angular?

La directiva `ngClass` establece dinámicamente clases CSS en un elemento según las condiciones.



<div [ngClass]="{ 'active': isActive, 'inactive': !isActive }">

    Conditional classes

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

134. ¿Cómo se crea un componente con Angular CLI?

Puede crear un componente utilizando el comando Angular CLI `ng generate componente` o `ng g c`.



ng generate component my-component

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

135. ¿Para qué se utiliza el `ng-content` de Angular?

La directiva `ng-content` se utiliza para la proyección de contenido, lo que le permite insertar contenido en la plantilla de un componente.



@Component({

    selector: 'app-wrapper',

    template: '<ng-content></ng-content>'

})

export class WrapperComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

136. ¿Cómo se utiliza el decorador `@ViewChild` de Angular?

El decorador `@ViewChild` se utiliza para consultar un único elemento o componente secundario.



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

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<app-child></app-child>`

})

export class ParentComponent {

    @ViewChild(ChildComponent) child: ChildComponent;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

137. ¿Cuál es el propósito del decorador `@Output`?

El decorador `@Output` se utiliza para definir un evento que un componente secundario puede emitir a su componente principal.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: '<button (click)="sendMessage()">Send</button>'

})

export class ChildComponent {

    @Output() messageEvent = new EventEmitter<string>();



    sendMessage() {

        this.messageEvent.emit('Hello from child');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

138. ¿Cómo se manejan los errores en las solicitudes HTTP angulares?

Los errores en las solicitudes HTTP se pueden manejar utilizando el operador `catchError` en RxJS.



import { HttpClient } from '@angular/common/http';

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

import { catchError } from 'rxjs/operators';

import { de } from 'rxjs';



@Component({

    selector: 'app-http',

    template: '<p>Data: {{ data }}</p>'

})

export class HttpComponent {

    data: any;



    constructor(private http: HttpClient) {

        this.http.get('https://api.example.com/data')

            .pipe(

                catchError(error => {

                    console.error('Error:', error);

                    return of([]);

                })

            )

            .subscribe(response => this.data = response);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

139. ¿Cómo se crea una ruta con parámetros en Angular?

Las rutas con parámetros se definen utilizando dos puntos `:` seguidos del nombre del parámetro.



const routes: Routes = [

    { path: 'user/:id', component: UserComponent }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

140. ¿Para qué se utiliza el gancho del ciclo de vida `ngOnDestroy` de Angular?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para realizar tareas de limpieza cuando se destruye el componente.



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



@Component({

    selector: 'app-example',

    template: '<p>Component with cleanup</p>'

})

export class ExampleComponent implements OnDestroy {

    ngOnDestroy() {

        console.log('Component destroyed');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares básicas - Parte 15

1. ¿Cómo se utiliza el decorador `@Output` de Angular para crear eventos personalizados?

El decorador `@Output` se utiliza para crear eventos personalizados que un componente puede emitir.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-custom-button',

    template: '<button (click)="onClick()">Click me</button>'

})

export class CustomButtonComponent {

    @Output() clicked = new EventEmitter<void>();



    onClick() {

        this.clicked.emit();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Qué es el decorador `@ViewChild` de Angular y cómo se usa?

El decorador `@ViewChild` se utiliza para obtener una referencia a un componente o elemento secundario en la plantilla.



import { Component, ViewChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '<input #inputElement />'

})

export class ExampleComponent {

    @ViewChild('inputElement') input!: ElementRef;



    ngAfterViewInit() {

        this.input.nativeElement.focus();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza la directiva `ngIf` de Angular para mostrar elementos condicionalmente?

La directiva `ngIf` se utiliza para incluir o excluir elementos según una condición.



<div *ngIf="isVisible">This content is visible</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Para qué se utiliza el decorador `@Injectable` de Angular?

El decorador `@Injectable` se utiliza para definir un servicio que se puede inyectar en componentes u otros servicios.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    getData() {

        return 'Data';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza la directiva `ngFor` de Angular para iterar sobre un objeto?

La directiva `ngFor` se puede utilizar para iterar sobre objetos utilizando la sintaxis del par clave-valor.



<div *ngFor="let key de objectKeys(myObject)">

    {{ key }}: {{ myObject[key] }}

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    myObject = { a: 1, b: 2, c: 3 };

    objectKeys = Object.keys;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Para qué se utiliza el decorador `@HostBinding` de Angular?

El decorador `@HostBinding` se utiliza para vincular una propiedad del elemento host a una propiedad en la directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('class.highlighted') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se crea una tubería que filtra una lista de elementos en Angular?

Se puede crear una tubería personalizada para filtrar una lista según una condición.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({ name: 'filterList' })

export class FilterListPipe implements PipeTransform {

    transform(items: any[], searchText: string): any[] {

        if (!items) return [];

        if (!searchText) return items;

        searchText = searchText.toLowerCase();

        return items.filter(item => item.toLowerCase().includes(searchText));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Para qué se utiliza el decorador `@ContentChild` de Angular?

El decorador `@ContentChild` se utiliza para obtener una referencia a un elemento secundario proyectado en la vista del componente.



import { Component, ContentChild, AfterContentInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-parent',

    template: '<ng-content></ng-content>'

})

export class ParentComponent implements AfterContentInit {

    @ContentChild('content') content!: ElementRef;



    ngAfterContentInit() {

        console.log(this.content.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza el decorador `@Input` de Angular para pasar datos a un componente?

El decorador `@Input` se utiliza para pasar datos de un componente principal a un componente secundario.



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



@Component({

    selector: 'app-child',

    template: '<p>{{ data }}</p>'

})

export class ChildComponent {

    @Input() data!: string;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza la directiva `ngClass` de Angular para aplicar clases condicionalmente?

La directiva `ngClass` se puede utilizar para aplicar condicionalmente clases CSS basadas en una condición.



<div [ngClass]="{ 'active': isActive, 'inactive': !isActive }">

    Content

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Para qué se utiliza el decorador `@Inject` de Angular?

El decorador `@Inject` se utiliza para especificar una dependencia para inyección cuando no se puede inferir el tipo.



import { Injectable, Inject } from '@angular/core';



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    constructor(@Inject(String) private value: string) { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se implementa la directiva `ngModel` de Angular para el control de formularios?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional en formularios.

<input [(ngModel)]="value" />

<p>Value: {{ value }}</p>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    value = 'Initial value';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Qué es la `ng-template` de Angular y cómo se usa?

La directiva `ng-template` define una plantilla que se puede representar condicionalmente.

<ng-template #template>

    </ng-template><ng-template #template><p>This is a template</p>

</ng-template>



<div *ngIf="showTemplate; else template">

    <p>Content when condition is true</p>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnChanges` de Angular?

El gancho del ciclo de vida `ngOnChanges` se utiliza para detectar y actuar sobre cambios en las propiedades de entrada.



import { Component, OnChanges, SimpleChanges, Input } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '<p>{{ data }}</p>'

})

export class ExampleComponent implements OnChanges {

    @Input() data!: string;



    ngOnChanges(changes: SimpleChanges) {

        console.log(changes);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Para qué se utiliza el gancho del ciclo de vida `ngOnInit` de Angular?

El gancho del ciclo de vida `ngOnInit` se utiliza para realizar la inicialización del componente después de que Angular haya inicializado todas las propiedades vinculadas a datos.



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



@Component({

    selector: 'app-example',

    template: '<p>Component initialized</p>'

})

export class ExampleComponent implements OnInit {

    ngOnInit() {

        console.log('Component initialized');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza la directiva `ngSwitch` de Angular?

La directiva `ngSwitch` se utiliza para mostrar condicionalmente elementos basados en una expresión de cambio.



<div [ngSwitch]="condition">

    <p *ngSwitchCase="'value1'">Case 1</p>

    <p *ngSwitchCase="'value2'">Case 2</p>

    <p *ngSwitchDefault>Default case</p>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `ngContainer` de Angular?

El `ngContainer` se utiliza para agrupar elementos sin agregar elementos DOM adicionales.

<ng-container *ngIf="isVisible">

    </ng-container><ng-container *ngIf="isVisible"><p>Content is visible</p>

</ng-container>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza la directiva `ngFor` de Angular para iterar sobre una matriz?

La directiva `ngFor` se utiliza para repetir un bloque de HTML para cada elemento de una matriz.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `ngModel` de Angular para vincular las entradas del formulario a las propiedades del componente?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional con entradas de formulario.

<input [(ngModel)]="inputValue" />

<p>Input value: {{ inputValue }}</p>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    inputValue = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza el decorador `@NgModule` de Angular para definir un módulo?

El decorador `@NgModule` se utiliza para definir un módulo Angular, incluidos sus componentes, directivas y servicios.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares básicas - Parte 16

1. ¿Cómo se utiliza la directiva `ngIf` de Angular para representar condicionalmente un bloque de HTML?

La directiva `ngIf` se utiliza para incluir o excluir un bloque de HTML según una condición.



<div *ngIf="isVisible">

    <p>This content is conditionally rendered</p>

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cuál es el propósito del gancho del ciclo de vida `ngOnInit` de Angular?

El gancho del ciclo de vida `ngOnInit` se utiliza para realizar la lógica de inicialización después de que Angular haya establecido todas las propiedades de entrada.



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



@Component({

    selector: 'app-example',

    template: '<p>Component Initialized</p>'

})

export class ExampleComponent implements OnInit {

    ngOnInit() {

        console.log('Component Initialized');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se puede utilizar `ngClass` de Angular para aplicar dinámicamente clases CSS?

La directiva `ngClass` se puede utilizar para agregar o eliminar dinámicamente clases CSS según las condiciones.



<div [ngClass]="{'active': isActive, 'inactive': !isActive}">

    Content with dynamic classes

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se crea una directiva Angular personalizada?

Para crear una directiva personalizada, utiliza el decorador `@Directive` e implementa la lógica de la directiva.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) {}



    @HostListener('mouseenter') onMouseEnter() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'transparent');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `ngFor` de Angular para iterar sobre una matriz de objetos?

La directiva `ngFor` se utiliza para recorrer una matriz y generar HTML para cada elemento.



<ul>

    <li *ngFor="let item de items">{{ item.name }} - {{ item.value }}</li>

</ul>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    items = [

        { name: 'Item 1', value: 10 },

        { name: 'Item 2', value: 20 },

        { name: 'Item 3', value: 30 }

    ];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Qué es el decorador `@Input` de Angular y cómo se usa?

El decorador `@Input` le permite pasar datos de un componente principal a un componente secundario.



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



@Component({

    selector: 'app-child',

    template: '<p>{{ data }}</p>'

})

export class ChildComponent {

    @Input() data!: string;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza el decorador `@Output` de Angular para emitir eventos desde un componente?

El decorador `@Output` se utiliza para definir un evento que un componente puede emitir a su componente principal.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-button',

    template: '<button (click)="onClick()">Click me</button>'

})

export class ButtonComponent {

    @Output() clicked = new EventEmitter<void>();



    onClick() {

        this.clicked.emit();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Para qué se utiliza el decorador `@NgModule` de Angular?

El decorador `@NgModule` define un módulo Angular, incluidos sus componentes, directivas, canalizaciones y servicios.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se vincula un evento en Angular?

El enlace de eventos se realiza utilizando paréntesis alrededor del nombre del evento en la plantilla.



<button (click)="handleClick()">Click me</button>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    handleClick() {

        console.log('Button clicked');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Qué es el `ng-container` de Angular y cómo se usa?

El `ng-container` se utiliza para agrupar elementos sin agregar elementos DOM adicionales.

<ng-container *ngIf="isVisible">

    </ng-container><ng-container *ngIf="isVisible"><p>Content is visible</p>

</ng-container>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se maneja la validación de formularios en Angular?

La validación de formularios se maneja utilizando `FormGroup` y `FormControl` con validadores integrados o personalizados.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-form',

    template: '<form [formGroup]="form" (ngSubmit)="onSubmit()">...</form>'

})

export class FormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['', Validators.required],

            email: ['', [Validators.required, Validators.email]]

        });

    }



    onSubmit() {

        if (this.form.valid) {

            console.log(this.form.value);

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Para qué se utiliza el decorador `@HostListener` de Angular?

El decorador `@HostListener` se utiliza para escuchar eventos en el elemento host de una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Element clicked', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP?

El servicio `HttpClient` se utiliza para realizar solicitudes HTTP a un servidor y manejar respuestas.



import { HttpClient } from '@angular/common/http';

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



@Component({

    selector: 'app-data',

    template: '...',

})

export class DataComponent {

    constructor(private http: HttpClient) {}



    fetchData() {

        this.http.get('https://api.example.com/data').subscribe(data => {

            console.log(data);

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cuál es el propósito del gancho del ciclo de vida `ngOnDestroy` de Angular?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para limpiar recursos, como cancelar la suscripción a observables o desconectar controladores de eventos, antes de que se destruya un componente.



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

import { Subscription } from 'rxjs';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent implements OnDestroy {

    private subscription: Subscription;



    constructor() {

        this.subscription = someObservable.subscribe();

    }



    ngOnDestroy() {

        this.subscription.unsubscribe();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza la directiva `ngModel` de Angular para el enlace de datos bidireccional?

La directiva `ngModel` se utiliza para vincular valores de entrada de formulario a propiedades de componentes con enlace de datos bidireccional.

<input [(ngModel)]="inputValue" />

<p>Input value: {{ inputValue }}</p>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    inputValue = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza el decorador `@Injectable` de Angular?

El decorador `@Injectable` marca una clase como disponible para inyección de dependencia.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    getData() {

        return 'Data from service';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se puede implementar el enrutamiento en una aplicación Angular?

El enrutamiento en Angular se configura utilizando `RouterModule` y definiendo rutas en un módulo de enrutamiento.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home/home.component';

import { AboutComponent } from './about/about.component';



const routes: Routes = [

    { path: 'home', component: HomeComponent },

    { path: 'about', component: AboutComponent },

    { path: '', redirectTo: '/home', pathMatch: 'full' }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se crea un servicio en Angular y lo inyecta en un componente?

Cree un servicio usando `@Injectable`, luego inyéctelo en el constructor de un componente.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    getData() {

        return 'Data from service';

    }

}



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    constructor(private exampleService: ExampleService) {

        console.log(this.exampleService.getData());

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Qué son los módulos Angular y cómo se crea uno?

Los módulos angulares son clases con un decorador `@NgModule` que define un contexto para un conjunto de componentes, directivas, canalizaciones y servicios. Creas un módulo usando `@NgModule`.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza el decorador `@Pipe` de Angular para crear una tubería personalizada?

El decorador `@Pipe` define una tubería personalizada para transformar datos en plantillas.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

\

Preguntas angulares básicas - Parte 17

1. ¿Cómo se crea un componente en Angular?

Utilice el comando Angular CLI `ng generar componente `para crear un nuevo componente.



ng generate component my-component



// The command creates a folder with four files:

// my-component.component.ts

// my-component.component.html

// my-component.component.css

// my-component.component.spec.ts

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Para qué se utiliza el decorador `@Component` de Angular?

El decorador `@Component` se utiliza para definir un componente, incluidos sus metadatos como selector, plantilla y URL de estilo.



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



@Component({

    selector: 'app-example',

    templateUrl: './example.component.html',

    styleUrls: ['./example.component.css']

})

export class ExampleComponent {

    // Component logic

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se puede manejar el envío de formularios en Angular?

Maneje el envío de formularios usando el evento `(ngSubmit)` en la plantilla y manejándolo en el componente.



<form (ngSubmit)="onSubmit()" #myForm="ngForm">

    <input name="name" ngModel required />

    <button type="submit">Submit</button>

</form>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    onSubmit() {

        console.log('Form submitted');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se implementa el renderizado condicional en Angular?

Utilice la directiva `*ngIf` de Angular para representar condicionalmente elementos según una condición.



<div *ngIf="isVisible">

    <p>This content is conditionally rendered</p>

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Qué es el decorador `@NgModule` de Angular y su propósito?

El decorador `@NgModule` define un módulo Angular, incluidas declaraciones, importaciones, proveedores y componentes de arranque.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se vinculan datos a la vista de un componente Angular?

El enlace de datos se realiza mediante interpolación `{{}}`, enlace de propiedad `[propiedad]` y enlace de evento `(evento)`.

<!-- Interpolation -->

<p>{{ message }}</p>



<!-- Property Binding -->

<img [src]="imageUrl" />



<!-- Event Binding -->

<button (click)="handleClick()">Click me</button>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    message = 'Hello, Angular!';

    imageUrl = 'https://example.com/image.jpg';



    handleClick() {

        console.log('Button clicked');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza la directiva `ngFor` de Angular para iterar sobre una matriz?

La directiva `ngFor` se utiliza para repetir un elemento para cada elemento de una matriz.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cuál es el propósito del decorador `@Injectable` de Angular?

El decorador `@Injectable` marca una clase como disponible para inyección de dependencia.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    getData() {

        return 'Data from service';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `ngModel` de Angular para el enlace de datos bidireccional?

La directiva `ngModel` permite el enlace de datos bidireccional vinculando los valores de entrada del formulario a las propiedades del componente.

<input [(ngModel)]="inputValue" />

<p>Input value: {{ inputValue }}</p>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    inputValue = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se definen rutas en Angular?

Las rutas se definen utilizando `RouterModule` y especificando configuraciones de ruta en un módulo de enrutamiento.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home/home.component';

import { AboutComponent } from './about/about.component';



const routes: Routes = [

    { path: 'home', component: HomeComponent },

    { path: 'about', component: AboutComponent },

    { path: '', redirectTo: '/home', pathMatch: 'full' }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos en el elemento host?

El decorador `@HostListener` le permite escuchar eventos en el elemento host de una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Element clicked', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Para qué se utiliza el decorador `@Pipe` en Angular?

El decorador `@Pipe` define una tubería personalizada para transformar datos en plantillas.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se puede inyectar un servicio en un componente en Angular?

Inyecte un servicio en un componente agregándolo al constructor del componente.



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

import { ExampleService } from './example.service';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    constructor(private exampleService: ExampleService) {

        console.log(this.exampleService.getData());

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Qué son los módulos Angular y cómo se utilizan?

Los módulos angulares son clases anotadas con `@NgModule` que agrupan componentes, directivas, canalizaciones y servicios relacionados. Se utilizan para organizar una aplicación en bloques cohesivos.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza la directiva `ngClass` de Angular para el estilo condicional?

La directiva `ngClass` le permite agregar o eliminar dinámicamente clases CSS según las condiciones.



<div [ngClass]="{'active': isActive, 'inactive': !isActive}">

    Conditional styling

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se maneja la entrada del usuario en formularios angulares?

Maneje la entrada del usuario utilizando el módulo de formularios de Angular, ya sea con formularios basados en plantillas o formularios reactivos.

<!-- Template-driven form -->

<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">

    <input name="name" ngModel required />

    <button type="submit">Submit</button>

</form>



<!-- Reactive form -->

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['']

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se crea una tubería en Angular?

Cree una tubería personalizada definiendo una clase con el decorador `@Pipe` e implementando la interfaz `PipeTransform`.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'uppercase'

})

export class UppercasePipe implements PipeTransform {

    transform(value: string): string {

        return value.toUpperCase();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cuál es el propósito del gancho del ciclo de vida `ngOnInit` de Angular?

El enlace del ciclo de vida `ngOnInit` se utiliza para inicializar las propiedades del componente y realizar cualquier configuración necesaria después de que se hayan inicializado las propiedades vinculadas a datos del componente.



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



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent implements OnInit {

    ngOnInit() {

        console.log('Component initialized');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se pasan datos de un componente principal a un componente secundario en Angular?

Pase datos a un componente secundario usando las propiedades `@Input`.



<!-- Parent component template -->

<app-child [data]="parentData"></app-child>



<!-- Child component -->

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



@Component({

    selector: 'app-child',

    template: '...',

})

export class ChildComponent {

    @Input() data: any;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza el decorador `@Output` de Angular para emitir eventos desde un componente secundario?

El decorador `@Output` se utiliza para emitir eventos de un componente secundario a un componente principal.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: '<button (click)="notify()">Notify</button>',

})

export class ChildComponent {

    @Output() notifyEvent = new EventEmitter<void>();



    notify() {

        this.notifyEvent.emit();

    }

}



// Parent component template

<app-child (notifyEvent)="onNotify()"></app-child>



@Component({

    selector: 'app-parent',

    template: '...',

})

export class ParentComponent {

    onNotify() {

        console.log('Notification received');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares básicas - Parte 17

1. ¿Cómo se crea un componente en Angular?

Utilice el comando Angular CLI `ng generar componente `para crear un nuevo componente.



ng generate component my-component



// The command creates a folder with four files:

// my-component.component.ts

// my-component.component.html

// my-component.component.css

// my-component.component.spec.ts

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Para qué se utiliza el decorador `@Component` de Angular?

El decorador `@Component` se utiliza para definir un componente, incluidos sus metadatos como selector, plantilla y URL de estilo.



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



@Component({

    selector: 'app-example',

    templateUrl: './example.component.html',

    styleUrls: ['./example.component.css']

})

export class ExampleComponent {

    // Component logic

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se puede manejar el envío de formularios en Angular?

Maneje el envío de formularios usando el evento `(ngSubmit)` en la plantilla y manejándolo en el componente.



<form (ngSubmit)="onSubmit()" #myForm="ngForm">

    <input name="name2" ngModel required />

    <button type="submit">Submit</button>

</form>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    onSubmit() {

        console.log('Form submitted');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se implementa el renderizado condicional en Angular?

Utilice la directiva `*ngIf` de Angular para representar condicionalmente elementos según una condición.



<div *ngIf="isVisible">

    <p>This content is conditionally rendered</p>

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Qué es el decorador `@NgModule` de Angular y su propósito?

El decorador `@NgModule` define un módulo Angular, incluidas declaraciones, importaciones, proveedores y componentes de arranque.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se vinculan datos a la vista de un componente Angular?

El enlace de datos se realiza mediante interpolación `{{}}`, enlace de propiedad `[propiedad]` y enlace de evento `(evento)`.

<!-- Interpolation -->

<p>{{ message }}</p>



<!-- Property Binding -->

<img alt="" [src]="imageUrl" />



<!-- Event Binding -->

<button (click)="handleClick()">Click me</button>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    message = 'Hello, Angular!';

    imageUrl = 'https://example.com/image.jpg';



    handleClick() {

        console.log('Button clicked');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza la directiva `ngFor` de Angular para iterar sobre una matriz?

La directiva `ngFor` se utiliza para repetir un elemento para cada elemento de una matriz.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cuál es el propósito del decorador `@Injectable` de Angular?

El decorador `@Injectable` marca una clase como disponible para inyección de dependencia.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    getData() {

        return 'Data from service';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `ngModel` de Angular para el enlace de datos bidireccional?

La directiva `ngModel` permite el enlace de datos bidireccional vinculando los valores de entrada del formulario a las propiedades del componente.

<input [(ngModel)]="inputValue" />

<p>Input value: {{ inputValue }}</p>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    inputValue = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se definen rutas en Angular?

Las rutas se definen utilizando `RouterModule` y especificando configuraciones de ruta en un módulo de enrutamiento.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home/home.component';

import { AboutComponent } from './about/about.component';



const routes: Routes = [

    { path: 'home', component: HomeComponent },

    { path: 'about', component: AboutComponent },

    { path: '', redirectTo: '/home', pathMatch: 'full' }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos en el elemento host?

El decorador `@HostListener` le permite escuchar eventos en el elemento host de una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Element clicked', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Para qué se utiliza el decorador `@Pipe` en Angular?

El decorador `@Pipe` define una tubería personalizada para transformar datos en plantillas.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se puede inyectar un servicio en un componente en Angular?

Inyecte un servicio en un componente agregándolo al constructor del componente.



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

import { ExampleService } from './example.service';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    constructor(private exampleService: ExampleService) {

        console.log(this.exampleService.getData());

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Qué son los módulos Angular y cómo se utilizan?

Los módulos angulares son clases anotadas con `@NgModule` que agrupan componentes, directivas, canalizaciones y servicios relacionados. Se utilizan para organizar una aplicación en bloques cohesivos.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza la directiva `ngClass` de Angular para el estilo condicional?

La directiva `ngClass` le permite agregar o eliminar dinámicamente clases CSS según las condiciones.



<div [ngClass]="{'active': isActive, 'inactive': !isActive}">

    Conditional styling

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se maneja la entrada del usuario en formularios angulares?

Maneje la entrada del usuario utilizando el módulo de formularios de Angular, ya sea con formularios basados en plantillas o formularios reactivos.

<!-- Template-driven form -->

<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">

    <input name="name2" ngModel required />

    <button type="submit">Submit</button>

</form>



<!-- Reactive form -->

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['']

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se crea una tubería en Angular?

Cree una tubería personalizada definiendo una clase con el decorador `@Pipe` e implementando la interfaz `PipeTransform`.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'uppercase'

})

export class UppercasePipe implements PipeTransform {

    transform(value: string): string {

        return value.toUpperCase();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cuál es el propósito del gancho del ciclo de vida `ngOnInit` de Angular?

El enlace del ciclo de vida `ngOnInit` se utiliza para inicializar las propiedades del componente y realizar cualquier configuración necesaria después de que se hayan inicializado las propiedades vinculadas a datos del componente.



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



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent implements OnInit {

    ngOnInit() {

        console.log('Component initialized');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se pasan datos de un componente principal a un componente secundario en Angular?

Pase datos a un componente secundario usando las propiedades `@Input`.



<!-- Parent component template -->

<app-child [data]="parentData"></app-child>



<!-- Child component -->

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



@Component({

    selector: 'app-child',

    template: '...',

})

export class ChildComponent {

    @Input() data: any;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza el decorador `@Output` de Angular para emitir eventos desde un componente secundario?

El decorador `@Output` se utiliza para emitir eventos de un componente secundario a un componente principal.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: '<button (click)="notify()">Notify</button>',

})

export class ChildComponent {

    @Output() notifyEvent = new EventEmitter<void>();



    notify() {

        this.notifyEvent.emit();

    }

}



// Parent component template

<app-child (notifyEvent)="onNotify()"></app-child>



@Component({

    selector: 'app-parent',

    template: '...',

})

export class ParentComponent {

    onNotify() {

        console.log('Notification received');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares básicas - Parte 18

1. ¿Cómo se crea un módulo en Angular?

Cree un módulo usando el comando Angular CLI `ng generar módulo ` o manualmente definiendo una clase con el decorador `@NgModule`.



ng generate module my-module



// Example de manually creating a module

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

import { CommonModule } from '@angular/common';

import { MyComponent } from './my.component';



@NgModule({

    declarations: [MyComponent],

    imports: [CommonModule],

    exports: [MyComponent]

})

export class MyModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se configura el enrutamiento en una aplicación Angular?

Configure el enrutamiento definiendo rutas en `AppRoutingModule` y usando ` `directiva en la plantilla principal.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home/home.component';

import { AboutComponent } from './about/about.component';



const routes: Routes = [

    { path: 'home', component: HomeComponent },

    { path: 'about', component: AboutComponent },

    { path: '', redirectTo: '/home', pathMatch: 'full' }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }



// In the main template

<router-outlet></router-outlet>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se implementa la carga diferida en Angular?

Implemente la carga diferida configurando rutas con la propiedad `loadChildren`.



const routes: Routes = [

    { path: 'home', loadChildren: () => import('./home/home.module').then(m => m.HomeModule) },

    { path: '', redirectTo: '/home', pathMatch: 'full' }

];



// In home-routing.module.ts

const routes: Routes = [

    { path: '', component: HomeComponent }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Qué son los servicios Angular y cómo se utilizan?

Los servicios angulares son clases que manejan la lógica empresarial y el acceso a datos. Se utilizan inyectándolos en componentes u otros servicios.



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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    getData() {

        return 'Data from service';

    }

}



// Injecting service into a component

@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    constructor(private dataService: DataService) {

        console.log(this.dataService.getData());

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se realizan solicitudes HTTP en Angular?

Realice solicitudes HTTP utilizando el servicio `HttpClient`.



import { HttpClient } from '@angular/common/http';

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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    constructor(private http: HttpClient) { }



    fetchData() {

        return this.http.get('https://api.example.com/data');

    }

}



// In the component

@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    data: any;



    constructor(private dataService: DataService) {

        this.dataService.fetchData().subscribe(response => {

            this.data = response;

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cuál es el propósito de la directiva "ngIf" de Angular?

La directiva `ngIf` incluye o excluye condicionalmente elementos en el DOM según una expresión.



<div *ngIf="isVisible">

    <p>This content is visible</p>

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza la directiva `ngFor` de Angular para recorrer una matriz?

La directiva `ngFor` repite un elemento para cada elemento de una matriz.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Para qué se utiliza el decorador `@Output` de Angular?

El decorador `@Output` se utiliza para crear eventos personalizados que los componentes pueden emitir para notificar a sus componentes principales.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: '<button (click)="notify()">Notify</button>',

})

export class ChildComponent {

    @Output() notifyEvent = new EventEmitter<void>();



    notify() {

        this.notifyEvent.emit();

    }

}



// In the parent component

@Component({

    selector: 'app-parent',

    template: '...',

})

export class ParentComponent {

    onNotify() {

        console.log('Notification received');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza el decorador `@Input` de Angular?

El decorador `@Input` se utiliza para pasar datos de un componente principal a un componente secundario.



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



@Component({

    selector: 'app-child',

    template: '<p>{{ data }}</p>',

})

export class ChildComponent {

    @Input() data: string;

}



// In the parent component

@Component({

    selector: 'app-parent',

    template: '<app-child [data]="parentData"></app-child>',

})

export class ParentComponent {

    parentData = 'Data from parent';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Qué son los módulos Angular y por qué son importantes?

Los módulos en Angular se utilizan para organizar una aplicación en bloques cohesivos. Ayudan a gestionar y encapsular componentes, servicios, directivas y tuberías.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { MyModule } from './my.module';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule, MyModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se maneja la validación de formularios en Angular?

La validación de formularios en Angular se puede manejar utilizando validadores integrados o validadores personalizados en formularios reactivos y basados en plantillas.

<!-- Template-driven form -->

<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">

    <input name="name3" ngModel required />

    <div *ngIf="myForm.submitted && !myForm.controls.name?.valid">

        Name is required

    </div>

    <button type="submit">Submit</button>

</form>



// Reactive form

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['', Validators.required]

        });

    }



    onSubmit() {

        if (this.form.valid) {

            console.log(this.form.value);

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se crean y utilizan directivas personalizadas en Angular?

Cree directivas personalizadas para ampliar el comportamiento de los elementos de su aplicación.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) { }



    @HostListener('mouseover') onMouseOver() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseout') onMouseOut() {

        this.renderer.removeStyle(this.el.nativeElement, 'backgroundColor');

    }

}



// In the component template

<p appHighlight>Hover over me!</p>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cuál es la estrategia de detección de cambios de Angular y cómo se puede personalizar?

La estrategia de detección de cambios de Angular determina cómo y cuándo se actualiza la vista. La estrategia predeterminada es "CheckAlways", pero se puede personalizar como "OnPush" para optimizar el rendimiento.



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



@Component({

    selector: 'app-example',

    template: '...',

    changeDetection: ChangeDetectionStrategy.OnPush

})

export class ExampleComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se implementa la inyección de dependencia en Angular?

Implemente la inyección de dependencia proporcionando servicios en módulos o componentes de Angular e inyectándolos en los constructores.



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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    getData() {

        return 'Data from service';

    }

}



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    constructor(private dataService: DataService) {

        console.log(this.dataService.getData());

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utilizan las canalizaciones integradas de Angular para formatear?

Angular proporciona canalizaciones integradas para formatear datos en plantillas, como `DatePipe`, `CurrencyPipe` y `DecimalPipe`.



<p>{{ today | date:'shortDate' }}</p>

<p>{{ amount | currency:'USD' }}</p>

<p>{{ number | number:'1.2-2' }}</p>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    today = new Date();

    amount = 1234.56;

    number = 1234.5678;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se gestiona el estado en una aplicación Angular?

La gestión del estado en Angular se puede manejar mediante servicios o soluciones más avanzadas como NgRx para aplicaciones grandes.



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

import { BehaviorSubject } from 'rxjs';



@Injectable({

    providedIn: 'root'

})

export class StateService {

    private state = new BehaviorSubject<any>({});

    state$ = this.state.asObservable();



    setState(newState: any) {

        this.state.next(newState);

    }

}



// In the component

@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    state$ = this.stateService.state$;



    constructor(private stateService: StateService) { }



    updateState() {

        this.stateService.setState({ key: 'value' });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se manejan los errores en las solicitudes HTTP angulares?

Maneje los errores en las solicitudes HTTP utilizando el operador `catchError` de RxJS y manejándolos en el servicio.



import { catchError } from 'rxjs/operators';

import { throwError } from 'rxjs';



@Injectable({

    providedIn: 'root'

})

export class DataService {

    constructor(private http: HttpClient) { }



    fetchData() {

        return this.http.get('https://api.example.com/data').pipe(

            catchError(error => {

                console.error('Error occurred:', error);

                return throwError(error);

            })

        );

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnDestroy` de Angular?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para realizar la limpieza antes de que se destruya el componente.



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

import { Subscription } from 'rxjs';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent implements OnDestroy {

    private subscription: Subscription;



    ngOnDestroy() {

        if (this.subscription) {

            this.subscription.unsubscribe();

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza el decorador `@HostListener` de Angular?

El decorador `@HostListener` le permite escuchar eventos en el elemento host de una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event'])

    onClick(event: MouseEvent) {

        console.log('Element clicked:', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza la directiva `ngStyle` de Angular para el estilo dinámico?

La directiva `ngStyle` le permite configurar múltiples estilos en línea de forma dinámica en función de una expresión.



<div [ngStyle]="{'color': isRed ? 'red' : 'blue', 'font-size': fontSize + 'px'}">

    Dynamic styling

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isRed = true;

    fontSize = 16;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares básicas - Parte 19

1. ¿Cómo se utiliza la directiva `ngClass` de Angular?

La directiva `ngClass` le permite agregar o eliminar dinámicamente clases CSS basadas en una expresión.



<div [ngClass]="{'active': isActive, 'disabled': isDisabled}">

    Dynamic classes

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isActive = true;

    isDisabled = false;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Qué son las guardas angulares y cómo se utilizan?

Las guardas angulares se utilizan para proteger rutas y controlar el acceso. Se pueden implementar utilizando interfaces como `CanActivate`, `CanDeactivate`, `Resolve` y `CanLoad`.



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

import { CanActivate, Router } from '@angular/router';



@Injectable({

    providedIn: 'root'

})

export class AuthGuard implements CanActivate {

    constructor(private router: Router) { }



    canActivate(): boolean {

        const isAuthenticated = false; // Replace with actual authentication check

        if (isAuthenticated) {

            return true;

        } else {

            this.router.navigate(['/login']);

            return false;

        }

    }

}



// In app-routing.module.ts

const routes: Routes = [

    { path: 'protected', component: ProtectedComponent, canActivate: [AuthGuard] }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utilizan los decoradores `@ContentChild` y `@ContentChildren` de Angular?

Los decoradores `@ContentChild` y `@ContentChildren` se utilizan para acceder al contenido proyectado en un componente usando `ng-content`.



import { Component, ContentChild, ContentChildren, QueryList, AfterContentInit } from '@angular/core';

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



@Component({

    selector: 'app-parent',

    template: '<ng-content></ng-content>',

})

export class ParentComponent implements AfterContentInit {

    @ContentChild('header') header: ElementRef;

    @ContentChildren('item') items: QueryList<ElementRef>;



    ngAfterContentInit() {

        console.log(this.header.nativeElement.textContent);

        this.items.forEach(item => console.log(item.nativeElement.textContent));

    }

}



// In the parent component template

<app-parent>

    </app-parent><app-parent><h1 #header>Header</h1>

    <p #item>Item 1</p>

    <p #item>Item 2</p>

</app-parent>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Qué es `Renderer2` de Angular y cómo se usa?

`Renderer2` es un servicio Angular que se utiliza para manipular el DOM de una manera segura y compatible con diferentes plataformas.



import { Renderer2, ElementRef, AfterViewInit } from '@angular/core';

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



@Component({

    selector: 'app-example',

    template: '<div #myDiv></div>',

})

export class ExampleComponent implements AfterViewInit {

    constructor(private renderer: Renderer2, private el: ElementRef) { }



    ngAfterViewInit() {

        const div = this.el.nativeElement.querySelector('div');

        this.renderer.setStyle(div, 'color', 'red');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `FormArray` de Angular para controles de formulario dinámicos?

`FormArray` se utiliza para administrar una serie de controles de formulario o grupos de formularios. Permite la adición y eliminación dinámica de elementos de formulario.



import { FormBuilder, FormArray, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            items: this.fb.array([])

        });

    }



    get items() {

        return this.form.get('items') as FormArray;

    }



    addItem() {

        this.items.push(this.fb.control(''));

    }



    removeItem(index: number) {

        this.items.removeAt(index);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utilizan las importaciones y exportaciones de `NgModule` de Angular?

Utilice las importaciones de `NgModule` para incluir otros módulos en su módulo y las exportaciones para que los componentes, directivas o canalizaciones estén disponibles fuera del módulo.



@NgModule({

    imports: [CommonModule, FormsModule],

    declarations: [MyComponent],

    exports: [MyComponent]

})

export class MyModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Para qué se utilizan los decoradores `@ViewChild` y `@ViewChildren` de Angular?

`@ViewChild` y `@ViewChildren` se utilizan para acceder a elementos o componentes dentro de la vista del componente.



import { Component, ViewChild, ViewChildren, QueryList, ElementRef, AfterViewInit } from '@angular/core';



@Component({

    selector: 'app-example',

    template: `

        <p #paragraph>Paragraph 1</p>

        <p #paragraph>Paragraph 2</p>

    `,

})

export class ExampleComponent implements AfterViewInit {

    @ViewChild('paragraph') paragraph: ElementRef;

    @ViewChildren('paragraph') paragraphs: QueryList<ElementRef>;



    ngAfterViewInit() {

        console.log(this.paragraph.nativeElement.textContent);

        this.paragraphs.forEach(p => console.log(p.nativeElement.textContent));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se crean y utilizan tuberías angulares?

Las tuberías angulares transforman datos en plantillas. Puede crear tuberías personalizadas implementando la interfaz `PipeTransform`.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}



// In the component template

<p>{{ 'Hello' | reverse }}</p>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Qué son los ganchos del ciclo de vida de Angular y cómo se utilizan?

Los ganchos del ciclo de vida son métodos que Angular llama en diferentes etapas del ciclo de vida de un componente, como `ngOnInit`, `ngOnChanges`, `ngOnDestroy`, etc.



import { Component, OnInit, OnDestroy } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent implements OnInit, OnDestroy {

    ngOnInit() {

        console.log('Component initialized');

    }



    ngOnDestroy() {

        console.log('Component destroyed');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza el servicio `ChangeDetectorRef` de Angular?

El servicio `ChangeDetectorRef` se utiliza para activar manualmente la detección de cambios.



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



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    constructor(private cdr: ChangeDetectorRef) { }



    triggerChangeDetection() {

        this.cdr.detectChanges();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se maneja la validación de formularios en Angular?

La validación de formularios en Angular se maneja mediante validadores en controles de formulario o grupos de formularios. Los validadores pueden ser sincrónicos o asincrónicos.



import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['', [Validators.required, Validators.minLength(3)]]

        });

    }



    get name() {

        return this.form.get('name');

    }



    onSubmit() {

        if (this.form.valid) {

            console.log(this.form.value);

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `HttpInterceptor` de Angular para solicitudes HTTP?

Utilice `HttpInterceptor` para interceptar solicitudes y respuestas HTTP para tareas como agregar encabezados o iniciar sesión.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const authReq = req.clone({

            headers: req.headers.set('Authorization', 'Bearer token')

        });

        return next.handle(authReq);

    }

}



// In app.module.ts

providers: [

    { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }

]

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular?

El decorador `@Input` permite que un componente reciba datos de su padre, y el decorador `@Output` permite que un componente emita eventos a su padre.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="notify()">Notify</button>`,

})

export class ChildComponent {

    @Input() message: string;

    @Output() notify: EventEmitter<string> = new EventEmitter<string>();



    notifyParent() {

        this.notify.emit('Hello from child');

    }

}



@Component({

    selector: 'app-parent',

    template: `<app-child [message]="parentMessage" (notify)="onNotify($event)"></app-child>`,

})

export class ParentComponent {

    parentMessage = 'Message from parent';



    onNotify(message: string) {

        console.log(message);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se crea un módulo de carga diferida en Angular?

Cree un módulo de carga diferida utilizando la propiedad `loadChildren` en la configuración de enrutamiento.



const routes: Routes = [

    {

        path: 'lazy',

        loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule)

    }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `NgModule` de Angular para la arquitectura modular?

Utilice `NgModule` para organizar una aplicación en bloques cohesivos de funcionalidad, lo que ayuda con la organización y reutilización del código.



@NgModule({

    declarations: [Component1, Component2],

    imports: [CommonModule, FormsModule],

    exports: [Component1]

})

export class SharedModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `ViewEncapsulation` de Angular?

`ViewEncapsulation` controla cómo se encapsulan los estilos dentro de un componente. Las opciones incluyen "Emulado", "Nativo" y "Ninguno".



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



@Component({

    selector: 'app-example',

    template: '...',

    styles: [`p { color: red; }`],

    encapsulation: ViewEncapsulation.None

})

export class ExampleComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza la tubería `async` de Angular?

La canalización `async` se suscribe automáticamente a un observable o promesa y devuelve el valor más reciente.



@Component({

    selector: 'app-example',

    template: `<p>{{ data$ | async }}</p>`,

})

export class ExampleComponent {

    data$ = this.dataService.getData();



    constructor(private dataService: DataService) { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza la directiva `ngFor` de Angular?

La directiva `ngFor` se utiliza para repetir un bloque de HTML para cada elemento de una matriz o lista.



<ul>

    <li *ngFor="let item de items">{{ item }}</li>

</ul>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza la directiva `ngIf` de Angular?

La directiva `ngIf` incluye o excluye condicionalmente un bloque de HTML basado en una expresión.



<p *ngIf="isVisible">Visible content</p>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza la directiva `ngSwitch` de Angular?

La directiva `ngSwitch` le permite incluir condicionalmente uno de varios elementos según un valor.



<div [ngSwitch]="selectedValue">

    <p *ngSwitchCase="'A'">Case A</p>

    <p *ngSwitchCase="'B'">Case B</p>

    <p *ngSwitchDefault>Default case</p>

</div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    selectedValue = 'A';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares básicas - Parte 20

1. ¿Cómo se utiliza el decorador `@Injectable` de Angular?

El decorador `@Injectable` marca una clase como disponible para ser proporcionada e inyectada como una dependencia.



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



@Injectable({

    providedIn: 'root',

})

export class ExampleService {

    constructor() { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Qué es `NgZone` de Angular y cómo se usa?

`NgZone` se usa para ejecutar código dentro o fuera de la zona de Angular para controlar la detección de cambios.



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



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    constructor(private ngZone: NgZone) { }



    runOutsideAngular() {

        this.ngZone.runOutsideAngular(() => {

            // Code here will not trigger Angular's change detection

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza el decorador `@HostListener` de Angular?

El decorador `@HostListener` le permite escuchar eventos en el elemento host de una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appHover]'

})

export class HoverDirective {

    @HostListener('mouseenter') onMouseEnter() {

        console.log('Mouse entered');

    }



    @HostListener('mouseleave') onMouseLeave() {

        console.log('Mouse left');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `@ViewEncapsulation` de Angular?

`@ViewEncapsulation` controla cómo se aplican los estilos a la vista del componente. Puede ser "Emulado", "Nativo" o "Ninguno".



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



@Component({

    selector: 'app-example',

    template: `<p>Styled text</p>`,

    styles: [`p { color: green; }`],

    encapsulation: ViewEncapsulation.Emulated

})

export class ExampleComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Qué es `Renderer2` de Angular y cómo se usa?

`Renderer2` es un servicio para manipular el DOM de forma segura.



import { Component, Renderer2, ElementRef, OnInit } from '@angular/core';



@Component({

    selector: 'app-example',

    template: `<div #myDiv></div>`,

})

export class ExampleComponent implements OnInit {

    constructor(private renderer: Renderer2, private el: ElementRef) { }



    ngOnInit() {

        const div = this.el.nativeElement.querySelector('div');

        this.renderer.setStyle(div, 'color', 'blue');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP?

`HttpClient` se utiliza para realizar solicitudes HTTP y manejar respuestas.



import { HttpClient } from '@angular/common/http';

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



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    constructor(private http: HttpClient) { }



    fetchData() {

        this.http.get('https://api.example.com/data').subscribe(data => {

            console.log(data);

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `NgModule` de Angular para organizar el código?

`NgModule` se utiliza para organizar una aplicación Angular en bloques coherentes de funcionalidad.



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule, HttpClientModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se crea una directiva Angular personalizada?

Cree una directiva personalizada para modificar el comportamiento o la apariencia de los elementos.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) { }



    @HostListener('mouseenter') onMouseEnter() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.renderer.removeStyle(this.el.nativeElement, 'backgroundColor');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Para qué se utilizan los ganchos del ciclo de vida `ngOnInit` y `ngOnChanges` de Angular?

`ngOnInit` se usa para la inicialización de componentes, mientras que `ngOnChanges` se usa para responder a cambios en las propiedades de entrada.



import { Component, OnInit, OnChanges, SimpleChanges, Input } from '@angular/core';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent implements OnInit, OnChanges {

    @Input() data: string;



    ngOnInit() {

        console.log('Component initialized');

    }



    ngOnChanges(changes: SimpleChanges) {

        console.log('Input properties changed', changes);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `FormBuilder` de Angular para crear formularios reactivos?

`FormBuilder` simplifica la creación de formularios reactivos.



import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['', Validators.required],

            email: ['', [Validators.required, Validators.email]]

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular?

`@Input` permite que un componente principal pase datos a un componente secundario, y `@Output` permite que un componente secundario emita eventos a un componente principal.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="notify()">Notify</button>`,

})

export class ChildComponent {

    @Input() childData: string;

    @Output() notify: EventEmitter<string> = new EventEmitter<string>();



    notifyParent() {

        this.notify.emit('Data from child');

    }

}



@Component({

    selector: 'app-parent',

    template: `<app-child [childData]="parentData" (notify)="handleNotify($event)"></app-child>`,

})

export class ParentComponent {

    parentData = 'Data from parent';



    handleNotify(data: string) {

        console.log(data);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se maneja la navegación y el enrutamiento en Angular?

Utilice el módulo Router de Angular para definir rutas y navegar entre diferentes vistas.



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

import { RouterModule, Routes } from '@angular/router';



const routes: Routes = [

    { path: 'home', component: HomeComponent },

    { path: 'about', component: AboutComponent },

    { path: '**', redirectTo: 'home' }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@NgModule` de Angular para crear un módulo de funciones?

Cree un módulo de funciones para encapsular componentes, directivas y servicios relacionados.



@NgModule({

    declarations: [FeatureComponent],

    imports: [CommonModule, SharedModule],

    exports: [FeatureComponent]

})

export class FeatureModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utilizan los decoradores `@ViewChild` y `@ContentChild` de Angular?

`@ViewChild` le permite acceder a un componente secundario o directiva, y `@ContentChild` le permite acceder al contenido proyectado.



import { Component, ViewChild, ContentChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-example',

    template: `<p #paragraph>Content</p><ng-content></ng-content>`,

})

export class ExampleComponent {

    @ViewChild('paragraph') paragraph: ElementRef;

    @ContentChild('content') content: ElementRef;



    ngAfterViewInit() {

        console.log(this.paragraph.nativeElement.textContent);

    }



    ngAfterContentInit() {

        console.log(this.content.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza la directiva `ngStyle` de Angular?

`ngStyle` se usa para establecer dinámicamente múltiples estilos en línea para un elemento.



@Component({

    selector: 'app-example',

    template: `<div [ngStyle]="{'color': color, 'font-size': fontSize}">Styled text</div>`,

})

export class ExampleComponent {

    color = 'blue';

    fontSize = '20px';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza la directiva `ngClass` de Angular?

`ngClass` se utiliza para agregar o eliminar dinámicamente clases CSS de un elemento según las condiciones.



@Component({

    selector: 'app-example',

    template: `<div [ngClass]="{'active': isActive, 'inactive': !isActive}">Classy div</div>`,

})

export class ExampleComponent {

    isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza la directiva `ngFor` de Angular para iterar sobre objetos?

`ngFor` se puede usar para iterar sobre objetos usando la canalización `keyvalue`.



<ul>

    <li *ngFor="let entry de object | keyvalue">{{ entry.key }}: {{ entry.value }}</li>

</ul>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent {

    object = { name: 'John', age: 30 };

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza la directiva `ngTemplateOutlet` de Angular?

`ngTemplateOutlet` se utiliza para insertar dinámicamente un ` ` en el DOM.

<ng-template #template>

    </ng-template><ng-template #template><p>Template content</p>

</ng-template>



<div [ngTemplateOutlet]="template"></div>



@Component({

    selector: 'app-example',

    template: '...',

})

export class ExampleComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza la directiva `ngContent` de Angular?

`ngContent` se utiliza para proyectar contenido en la plantilla de un componente.



@Component({

    selector: 'app-example',

    template: `<ng-content></ng-content>`,

})

export class ExampleComponent { }



@Component({

    selector: 'app-parent',

    template: `<app-example></app-example><app-example><p>Projected content</p></app-example>`,

})

export class ParentComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza el decorador `@HostBinding` de Angular?

`@HostBinding` se utiliza para vincular propiedades del elemento host a propiedades de componentes o directivas.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('class.highlighted') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Intermedio 340 preguntas

Formularios reactivos dinámicos con FormArray, patrones RxJS avanzados, DI jerárquica, componentes dinámicos, directivas y canalizaciones personalizadas y estrategias de detección de cambios. pagina original

Marco angular: conceptos intermedios y patrones avanzados (Parte 1).

Guía de preguntas y respuestas de nivel intermedio sobre Angular: formularios reactivos dinámicos (FormArray), operadores y patrones avanzados con RxJS, inyección de dependencias jerárquica (providedIn, @Optional, @Self, @SkipSelf), componentes dinámicos (ViewContainerRef, createComponent), directivas personalizadas, pipes puros e impuros, estrategias de detección de cambios (OnPush), ciclo de vida, enrutamiento con guards y resolvers, y comunicación entre componentes.

1. ¿Cómo se crea un formulario dinámico en Angular usando `FormArray`?

`FormArray` se utiliza para administrar una colección de controles de formulario en formularios reactivos angulares.



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

import { FormBuilder, FormGroup, FormArray } from '@angular/forms';



@Component({

    selector: 'app-dynamic-form',

    template: `

        <form [formGroup]="form">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i" />

                </div>

            </div>

            <button (click)="addItem()">Add Item</button>

        </form>

    `,

})

export class DynamicFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            items: this.fb.array([])

        });

    }



    get items() {

        return this.form.get('items') as FormArray;

    }



    addItem() {

        this.items.push(this.fb.control(''));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se implementa la carga diferida en Angular?

La carga diferida se implementa utilizando el módulo de enrutamiento de Angular definiendo rutas con una propiedad loadChildren.



const routes: Routes = [

    {

        path: 'feature',

        loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule)

    }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se pueden manejar los errores HTTP en Angular?

Los errores HTTP se pueden manejar utilizando `HttpInterceptor` de Angular para detectar y procesar errores HTTP globalmente.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse } from '@angular/common/http';

import { catchError } from 'rxjs/operators';

import { throwError } from 'rxjs';



@Injectable()

export class ErrorInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler) {

        return next.handle(req).pipe(

            catchError((error: HttpErrorResponse) => {

                // Handle error

                console.error('HTTP Error:', error);

                return throwError(error);

            })

        );

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `ContentChildren` de Angular para consultar contenido?

`@ContentChildren` permite consultar el contenido proyectado en Angular.



import { Component, ContentChildren, QueryList, AfterContentInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `

        <ng-content></ng-content>

    `,

})

export class ParentComponent implements AfterContentInit {

    @ContentChildren(ChildComponent) children: QueryList<ChildComponent>;



    ngAfterContentInit() {

        console.log(this.children.toArray());

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `ngIf` de Angular con la sintaxis `else`?

La directiva `ngIf` se puede usar con `else` para mostrar condicionalmente contenido alternativo.



@Component({

    selector: 'app-example',

    template: `

        <div *ngIf="isVisible; else notVisible">Content is visible</div>

        <ng-template #notVisible>Content is not visible</ng-template>

    `,

})

export class ExampleComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `ngFor` de Angular con la función `trackBy`?

La función `trackBy` se utiliza para optimizar la representación de listas mediante el seguimiento de los cambios en los elementos de la lista.



@Component({

    selector: 'app-example',

    template: `

        <div *ngFor="let item de items; trackBy: trackById">{{ item.name }}</div>

    `,

})

export class ExampleComponent {

    items = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }];



    trackById(index: number, item: any) {

        return item.id;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se crea una tubería angular personalizada?

Se crea una tubería personalizada para transformar los datos en la plantilla.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza el decorador `@HostListener` de Angular?

`@HostListener` permite escuchar eventos en el elemento host de una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appHover]'

})

export class HoverDirective {

    @HostListener('mouseenter') onMouseEnter() {

        console.log('Mouse entered');

    }



    @HostListener('mouseleave') onMouseLeave() {

        console.log('Mouse left');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se maneja la validación de formularios en Angular?

La validación de formularios se puede manejar utilizando los formularios reactivos y los validadores integrados de Angular.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-form',

    template: `

        <form [formGroup]="form" (ngSubmit)="onSubmit()">

            <input formControlName="name" />

            <div *ngIf="form.controls['name'].invalid">Name is required</div>

            <button type="submit">Submit</button>

        </form>

    `,

})

export class FormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['', Validators.required]

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza el decorador `@Inject` de Angular?

El decorador `@Inject` se utiliza para especificar el proveedor que se inyectará en una clase.



import { Injectable, Inject } from '@angular/core';

import { API_URL } from './tokens';



@Injectable({

    providedIn: 'root'

})

export class ApiService {

    constructor(@Inject(API_URL) private apiUrl: string) { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se implementa el manejo de errores personalizado en los servicios Angular?

Se puede implementar un manejo de errores personalizado utilizando `HttpInterceptor` de Angular para detectar y manejar errores HTTP.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse } from '@angular/common/http';

import { catchError } from 'rxjs/operators';

import { throwError } from 'rxjs';



@Injectable()

export class CustomErrorInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler) {

        return next.handle(req).pipe(

            catchError((error: HttpErrorResponse) => {

                // Custom error handling logic

                console.error('An error occurred:', error.message);

                return throwError(error);

            })

        );

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se crea un componente Angular reutilizable?

Un componente reutilizable se crea definiéndolo con un selector y proporcionando entradas y salidas.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-reusable',

    template: `

        <button (click)="onClick()">Click me</button>

    `,

})

export class ReusableComponent {

    @Input() label: string;

    @Output() clicked = new EventEmitter<void>();



    onClick() {

        this.clicked.emit();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza el sistema de inyección de dependencia de Angular?

La inyección de dependencia se utiliza para inyectar servicios u otras dependencias en componentes o servicios.



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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    getData() {

        return ['Item 1', 'Item 2'];

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se gestiona el estado de la aplicación en Angular?

El estado de la aplicación se puede gestionar mediante servicios o bibliotecas de gestión de estado como NgRx o Akita.



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

import { BehaviorSubject } from 'rxjs';



@Injectable({

    providedIn: 'root'

})

export class StateService {

    private state = new BehaviorSubject<any>({});

    state$ = this.state.asObservable();



    setState(newState: any) {

        this.state.next(newState);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se configuran los ajustes de compilación e implementación de Angular?

Las configuraciones de compilación e implementación se configuran en el archivo `angular.json`.



{

    "projects": {

        "my-app": {

            "architect": {

                "build": {

                    "options": {

                        "outputPath": "dist/my-app",

                        "index": "src/index.html",

                        "main": "src/main.ts",

                        "tsConfig": "tsconfig.app.json"

                    }

                }

            }

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se implementan guardias de ruta angulares?

Los guardias de ruta se utilizan para controlar el acceso a las rutas según las condiciones.



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

import { CanActivate, Router } from '@angular/router';



@Injectable({

    providedIn: 'root'

})

export class AuthGuard implements CanActivate {

    constructor(private router: Router) { }



    canActivate(): boolean {

        // Check authentication status

        const isAuthenticated = false;

        if (!isAuthenticated) {

            this.router.navigate(['/login']);

            return false;

        }

        return true;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP?

`HttpClient` se utiliza para realizar solicitudes HTTP a una API de backend.



import { HttpClient } from '@angular/common/http';

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



@Injectable({

    providedIn: 'root'

})

export class ApiService {

    constructor(private http: HttpClient) { }



    getData() {

        return this.http.get('https://api.example.com/data');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se crean y utilizan los servicios Angular?

Los servicios se utilizan para compartir datos y lógica entre múltiples componentes.



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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    getData() {

        return ['Item 1', 'Item 2'];

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular?

`@Input` se usa para pasar datos a un componente secundario y `@Output` se usa para emitir eventos desde un componente secundario.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="notify()">Notify</button>`,

})

export class ChildComponent {

    @Input() data: string;

    @Output() notifyEvent = new EventEmitter<string>();



    notify() {

        this.notifyEvent.emit('Notification from child');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza el decorador `@ViewChild` de Angular?

`@ViewChild` se utiliza para acceder a un componente secundario o elemento DOM desde el componente principal.



import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

    selector: 'app-parent',

    template: `<p #paragraph>Paragraph</p>`,

})

export class ParentComponent implements AfterViewInit {

    @ViewChild('paragraph') paragraph: ElementRef;



    ngAfterViewInit() {

        console.log(this.paragraph.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares intermedias - Parte 2

21. ¿Cómo se utiliza la directiva `ngSwitch` de Angular?

La directiva `ngSwitch` se utiliza para mostrar condicionalmente uno de varios elementos según el valor de una expresión.



@Component({

    selector: 'app-switch',

    template: `

        <div [ngSwitch]="value">

            <p *ngSwitchCase="'A'">Case A</p>

            <p *ngSwitchCase="'B'">Case B</p>

            <p *ngSwitchDefault>Default case</p>

        </div>

    `,

})

export class SwitchComponent {

    value = 'A';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

22. ¿Cómo se implementa una directiva Angular personalizada?

Se pueden crear directivas personalizadas para modificar el comportamiento o la apariencia de los elementos.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) { }



    @HostListener('mouseenter') onMouseEnter() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.renderer.removeStyle(this.el.nativeElement, 'backgroundColor');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

23. ¿Cómo se configuran los interceptores HTTP de Angular?

Los interceptores HTTP se utilizan para modificar solicitudes y respuestas HTTP.



import { HTTP_INTERCEPTORS } from '@angular/common/http';

import { ErrorInterceptor } from './error.interceptor';



@NgModule({

    providers: [

        { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }

    ]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

24. ¿Cómo se utiliza el decorador `@HostBinding` de Angular?

El decorador `@HostBinding` vincula una propiedad del elemento host a una propiedad de la directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appClass]'

})

export class ClassDirective {

    @HostBinding('class.active') isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

25. ¿Cómo se utiliza el decorador `@ViewChildren` de Angular?

El decorador `@ViewChildren` se utiliza para consultar múltiples elementos o directivas en la plantilla.



import { Component, ViewChildren, QueryList, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `

        <app-child *ngFor="let child de children"></app-child>

    `,

})

export class ParentComponent implements AfterViewInit {

    @ViewChildren(ChildComponent) childComponents: QueryList<ChildComponent>;



    ngAfterViewInit() {

        console.log(this.childComponents.toArray());

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

26. ¿Cómo se manejan las operaciones asincrónicas en componentes Angular?

Las operaciones asincrónicas se pueden manejar utilizando observables y operadores de RxJS.



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

import { ApiService } from './api.service';



@Component({

    selector: 'app-data',

    template: `

        <div *ngIf="data$ | async as data">

            {{ data | json }}

        </div>

    `,

})

export class DataComponent implements OnInit {

    data$ = this.apiService.getData();



    constructor(private apiService: ApiService) { }



    ngOnInit() { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

27. ¿Cómo se utiliza el decorador `@ContentChild` de Angular?

El decorador `@ContentChild` permite consultar un único elemento de contenido proyectado.



import { Component, ContentChild, AfterContentInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<ng-content></ng-content>`,

})

export class ParentComponent implements AfterContentInit {

    @ContentChild(ChildComponent) child: ChildComponent;



    ngAfterContentInit() {

        console.log(this.child);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

28. ¿Cómo se utiliza la directiva `ngClass` de Angular?

La directiva `ngClass` se utiliza para agregar o eliminar clases CSS dinámicamente.



@Component({

    selector: 'app-example',

    template: `

        <div [ngClass]="{'active': isActive, 'inactive': !isActive}">

            Conditional classes

        </div>

        <button (click)="toggle()">Toggle</button>

    `,

})

export class ExampleComponent {

    isActive = true;



    toggle() {

        this.isActive = !this.isActive;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

29. ¿Cómo se utiliza `ngModel` de Angular para el enlace de datos bidireccional?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional entre el control de formulario y el componente.



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



@Component({

    selector: 'app-two-way-binding',

    template: `

        <input [(ngModel)]="value" />

        <p>{{ value }}</p>

    `,

})

export class TwoWayBindingComponent {

    value = 'Initial value';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

30. ¿Cómo se utiliza el decorador `@Injectable` de Angular para servicios?

El decorador `@Injectable` marca una clase como un servicio que se puede inyectar en otros componentes o servicios.



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



@Injectable({

    providedIn: 'root'

})

export class ExampleService {

    getData() {

        return ['Data 1', 'Data 2'];

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

31. ¿Cómo se utiliza el servicio `Router` de Angular para la navegación?

El servicio `Router` se utiliza para navegar mediante programación entre rutas.



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

import { Router } from '@angular/router';



@Component({

    selector: 'app-navigate',

    template: `

        <button (click)="goToHome()">Go to Home</button>

    `,

})

export class NavigateComponent {

    constructor(private router: Router) { }



    goToHome() {

        this.router.navigate(['/home']);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

32. ¿Cómo se implementan los solucionadores de rutas de Angular?

Los solucionadores de rutas se utilizan para recuperar datos antes de navegar a una ruta.



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

import { Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router';

import { Observable } from 'rxjs';

import { ApiService } from './api.service';



@Injectable({

    providedIn: 'root'

})

export class DataResolver implements Resolve<any> {

    constructor(private apiService: ApiService) { }



    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {

        return this.apiService.getData();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

33. ¿Cómo se crean controles de forma angular de forma dinámica?

Se pueden crear controles de formulario dinámicos utilizando el servicio `FormBuilder` de Angular.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-dynamic-form',

    template: `

        <form [formGroup]="formGroup">

            <input formControlName="dynamicControl" />

        </form>

    `,

})

export class DynamicFormComponent {

    formGroup: FormGroup;



    constructor(private fb: FormBuilder) {

        this.formGroup = this.fb.group({

            dynamicControl: ['']

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

34. ¿Cómo se implementa la directiva `ngFor` de Angular con trackBy?

La función "trackBy" mejora el rendimiento al rastrear elementos por su identidad.



@Component({

    selector: 'app-list',

    template: `

        <ul>

            <li *ngFor="let item de items; trackBy: trackByFn">{{ item.name }}</li>

        </ul>

    `,

})

export class ListComponent {

    items = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }];



    trackByFn(index: number, item: any) {

        return item.id;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

35. ¿Cómo se implementa la directiva `ngIf` de Angular con `else`?

La directiva `ngIf` puede mostrar elementos condicionalmente con un bloque `else`.



@Component({

    selector: 'app-condition',

    template: `

        <div *ngIf="isVisible; else elseBlock">Visible</div>

        <ng-template #elseBlock>Not visible</ng-template>

    `,

})

export class ConditionComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

36. ¿Cómo se utiliza `HttpClient` de Angular para solicitudes POST?

`HttpClient` se utiliza para realizar solicitudes POST a una API de backend.



import { HttpClient } from '@angular/common/http';

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



@Injectable({

    providedIn: 'root'

})

export class ApiService {

    constructor(private http: HttpClient) { }



    postData(data: any) {

        return this.http.post('https://api.example.com/data', data);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

37. ¿Cómo se implementa `FormArray` de Angular para formularios dinámicos?

`FormArray` se utiliza para administrar una serie de controles de formulario.



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

import { FormBuilder, FormGroup, FormArray } from '@angular/forms';



@Component({

    selector: 'app-dynamic-form-array',

    template: `

        <form [formGroup]="formGroup">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i" />

                </div>

            </div>

            <button (click)="addItem()">Add Item</button>

        </form>

    `,

})

export class DynamicFormArrayComponent {

    formGroup: FormGroup;



    constructor(private fb: FormBuilder) {

        this.formGroup = this.fb.group({

            items: this.fb.array([this.fb.control('')])

        });

    }



    get items() {

        return this.formGroup.get('items') as FormArray;

    }



    addItem() {

        this.items.push(this.fb.control(''));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

38. ¿Cómo se implementa el gancho del ciclo de vida `ngOnDestroy` de Angular?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para limpiar recursos cuando se destruye un componente.



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

import { Subscription } from 'rxjs';



@Component({

    selector: 'app-cleanup',

    template: `<p>Cleanup example</p>`,

})

export class CleanupComponent implements OnDestroy {

    private subscription: Subscription;



    ngOnDestroy() {

        this.subscription.unsubscribe();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

39. ¿Cómo se utiliza `ng-template` de Angular para renderizar plantillas?

La directiva `ng-template` define una plantilla que se puede reutilizar o renderizar de forma condicional.



@Component({

    selector: 'app-template',

    template: `

        <ng-template #template let-data="data">

            </ng-template><ng-template #template let-data="data"><p>{{ data }}</p>

        </ng-template>

        <ng-container *ngTemplateOutlet="template; context: { data: 'Template data' }"></ng-container>

    `,

})

export class TemplateComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

40. ¿Cómo se implementa la directiva `ngFor` de Angular con `trackBy`?

La función `trackBy` ayuda a Angular a rastrear elementos en una lista y mejorar el rendimiento de renderizado.



@Component({

    selector: 'app-track-by',

    template: `

        <ul>

            <li *ngFor="let item de items; trackBy: trackByFn">{{ item.name }}</li>

        </ul>

    `,

})

export class TrackByComponent {

    items = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }];



    trackByFn(index: number, item: any) {

        return item.id;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares intermedias - Parte 3

41. ¿Cómo se utiliza el decorador `@ViewChild` de Angular con una bandera estática?

El decorador `@ViewChild` se puede utilizar con un indicador estático para determinar cuándo se debe resolver la consulta.



import { Component, ViewChild, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<app-child></app-child>`,

})

export class ParentComponent implements AfterViewInit {

    @ViewChild(ChildComponent, { static: true }) child: ChildComponent;



    ngAfterViewInit() {

        console.log(this.child);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

42. ¿Cómo se implementa la directiva `ngFor` de Angular con una sintaxis `let`?

La sintaxis `let` en `ngFor` le permite definir una variable para cada elemento del bucle.



@Component({

    selector: 'app-list',

    template: `

        <ul>

            <li *ngFor="let item de items; let i = index">

                {{ i + 1 }}: {{ item }}

            </li>

        </ul>

    `,

})

export class ListComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

43. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular en la comunicación entre padres e hijos?

El decorador `@Input` se usa para pasar datos de un componente principal a un componente secundario, mientras que el decorador `@Output` se usa para emitir eventos del componente secundario al principal.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `

        <button (click)="notifyParent()">Notify Parent</button>

    `,

})

export class ChildComponent {

    @Input() data: string;

    @Output() notify = new EventEmitter<string>();



    notifyParent() {

        this.notify.emit('Data from child');

    }

}



@Component({

    selector: 'app-parent',

    template: `

        <app-child [data]="parentData" (notify)="handleNotification($event)"></app-child>

    `,

})

export class ParentComponent {

    parentData = 'Data from parent';



    handleNotification(message: string) {

        console.log(message);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

44. ¿Cómo se utiliza el decorador `@ContentChildren` de Angular?

El decorador `@ContentChildren` consulta varios elementos de contenido proyectados en un componente.



import { Component, ContentChildren, QueryList, AfterContentInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<ng-content></ng-content>`,

})

export class ParentComponent implements AfterContentInit {

    @ContentChildren(ChildComponent) children: QueryList<ChildComponent>;



    ngAfterContentInit() {

        this.children.forEach(child => console.log(child));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

45. ¿Cómo se utilizan `FormGroup` y `FormControl` de Angular en formularios reactivos?

`FormGroup` y `FormControl` se utilizan para crear y administrar formularios reactivos.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

        <form [formGroup]="formGroup" (ngSubmit)="onSubmit()">

            <input formControlName="name" />

            <button type="submit">Submit</button>

        </form>

    `,

})

export class ReactiveFormComponent {

    formGroup: FormGroup;



    constructor(private fb: FormBuilder) {

        this.formGroup = this.fb.group({

            name: ['', Validators.required]

        });

    }



    onSubmit() {

        console.log(this.formGroup.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

46. ¿Cómo se utiliza el servicio `FormBuilder` de Angular?

El servicio `FormBuilder` simplifica la creación y validación de formularios en formularios Angular.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-builder-form',

    template: `

        <form [formGroup]="formGroup">

            <input formControlName="email" />

        </form>

    `,

})

export class BuilderFormComponent {

    formGroup: FormGroup;



    constructor(private fb: FormBuilder) {

        this.formGroup = this.fb.group({

            email: ['']

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

47. ¿Cómo se utiliza la clase `Validators` de Angular para la validación de formularios?

La clase `Validators` proporciona funciones de validación integradas para formularios.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-validate-form',

    template: `

        <form [formGroup]="formGroup" (ngSubmit)="onSubmit()">

            <input formControlName="email" />

            <div *ngIf="formGroup.controls.email.invalid">Invalid email</div>

            <button type="submit">Submit</button>

        </form>

    `,

})

export class ValidateFormComponent {

    formGroup: FormGroup;



    constructor(private fb: FormBuilder) {

        this.formGroup = this.fb.group({

            email: ['', [Validators.required, Validators.email]]

        });

    }



    onSubmit() {

        console.log(this.formGroup.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

48. ¿Cómo se utiliza el `Router` de Angular para la carga diferida?

La carga diferida permite cargar módulos según demanda, lo que mejora el rendimiento de la aplicación.



const routes: Routes = [

    {

        path: 'lazy',

        loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule)

    }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

49. ¿Cómo se maneja el envío de formularios con `ReactiveForms` de Angular?

El envío de formularios en formularios reactivos se puede manejar suscribiéndose al observable `valueChanges` o `statusChanges` del formulario.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

        <form [formGroup]="formGroup" (ngSubmit)="onSubmit()">

            <input formControlName="name" />

            <button type="submit">Submit</button>

        </form>

    `,

})

export class ReactiveFormComponent {

    formGroup: FormGroup;



    constructor(private fb: FormBuilder) {

        this.formGroup = this.fb.group({

            name: ['']

        });



        this.formGroup.valueChanges.subscribe(value => {

            console.log('Form value changed:', value);

        });

    }



    onSubmit() {

        console.log(this.formGroup.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

50. ¿Cómo se utiliza el `HttpInterceptor` de Angular para el manejo HTTP global?

Se puede utilizar un `HttpInterceptor` para modificar solicitudes o respuestas HTTP globalmente.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const clonedReq = req.clone({

            setHeaders: {

                Authorization: `Bearer your-token`

            }

        });



        return next.handle(clonedReq);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

51. ¿Cómo se utiliza el `Router` de Angular para los guardias de ruta?

Los guardias de ruta se pueden utilizar para controlar el acceso a las rutas en función de determinadas condiciones.



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

import { CanActivate, Router } from '@angular/router';



@Injectable({

    providedIn: 'root'

})

export class AuthGuard implements CanActivate {

    constructor(private router: Router) {}



    canActivate(): boolean {

        const isLoggedIn = false; // Replace with actual login check

        if (!isLoggedIn) {

            this.router.navigate(['/login']);

            return false;

        }

        return true;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

52. ¿Cómo se utiliza la `Directiva` de Angular para crear una directiva personalizada?

Se pueden crear directivas personalizadas para ampliar los elementos HTML con un comportamiento adicional.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) {}



    @HostListener('mouseenter') onMouseEnter() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'transparent');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

53. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

El servicio `ChangeDetectorRef` le permite controlar manualmente la detección de cambios.



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



@Component({

    selector: 'app-manual-detection',

    template: `<p>{{ message }}</p>`,

})

export class ManualDetectionComponent {

    message = 'Initial message';



    constructor(private cdRef: ChangeDetectorRef) {}



    updateMessage() {

        this.message = 'Updated message';

        this.cdRef.detectChanges();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

54. ¿Cómo se utiliza `EventEmitter` de Angular para comunicarse entre componentes?

La clase `EventEmitter` se utiliza para emitir eventos personalizados desde componentes secundarios a componentes principales.



import { Component, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="sendEvent()">Send Event</button>`,

})

export class ChildComponent {

    @Output() event = new EventEmitter<string>();



    sendEvent() {

        this.event.emit('Data from child');

    }

}



@Component({

    selector: 'app-parent',

    template: `

        <app-child (event)="handleEvent($event)"></app-child>

    `,

})

export class ParentComponent {

    handleEvent(message: string) {

        console.log(message);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

55. ¿Cómo se utiliza `NgModule` de Angular para crear módulos de funciones?

Los módulos de funciones le permiten organizar la funcionalidad de la aplicación en bloques coherentes.



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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';



@NgModule({

    declarations: [FeatureComponent],

    imports: [CommonModule],

    exports: [FeatureComponent]

})

export class FeatureModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

56. ¿Cómo se utiliza `NgZone` de Angular para gestionar la detección de cambios?

El servicio `NgZone` ayuda a controlar manualmente el proceso de detección de cambios de Angular.



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



@Component({

    selector: 'app-zone',

    template: `<p>{{ message }}</p>`,

})

export class ZoneComponent {

    message = 'Initial message';



    constructor(private ngZone: NgZone) {

        this.ngZone.runOutsideAngular(() => {

            setTimeout(() => {

                this.message = 'Updated message';

                this.ngZone.run(() => console.log('Change detected'));

            }, 1000);

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

57. ¿Cómo se utiliza `@HostListener` de Angular para manejar eventos DOM?

El decorador `@HostListener` le permite escuchar eventos DOM directamente en el elemento host de una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event']) onClick(event: Event) {

        console.log('Element clicked:', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

58. ¿Cómo se utiliza el decorador `@ViewChildren` de Angular para consultar múltiples elementos?

El decorador `@ViewChildren` consulta varios elementos dentro de la vista de un componente.



import { Component, ViewChildren, QueryList, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<app-child></app-child><app-child></app-child>`,

})

export class ParentComponent implements AfterViewInit {

    @ViewChildren(ChildComponent) children: QueryList<ChildComponent>;



    ngAfterViewInit() {

        this.children.forEach(child => console.log(child));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

59. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnChanges` de Angular?

El gancho del ciclo de vida `ngOnChanges` se utiliza para responder a cambios en las propiedades de entrada.



import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';



@Component({

    selector: 'app-changes',

    template: `<p>{{ inputValue }}</p>`,

})

export class ChangesComponent implements OnChanges {

    @Input() inputValue: string;



    ngOnChanges(changes: SimpleChanges) {

        console.log('Changes:', changes);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

60. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnInit` de Angular?

El gancho del ciclo de vida `ngOnInit` se utiliza para la lógica de inicialización de componentes.



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



@Component({

    selector: 'app-init',

    template: `<p>Component initialized</p>`,

})

export class InitComponent implements OnInit {

    ngOnInit() {

        console.log('Component initialized');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares intermedias - Parte 4

61. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnDestroy` de Angular?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para limpiar recursos y cancelar la suscripción a observables.



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

import { Subscription } from 'rxjs';



@Component({

    selector: 'app-destroy',

    template: `<p>Component destroyed</p>`,

})

export class DestroyComponent implements OnDestroy {

    private subscription: Subscription;



    ngOnDestroy() {

        // Unsubscribe to avoid memory leaks

        if (this.subscription) {

            this.subscription.unsubscribe();

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

62. ¿Cómo se utiliza `ngModel` de Angular para el enlace de datos bidireccional?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional entre controles de formulario y propiedades de componentes.



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



@Component({

    selector: 'app-two-way-binding',

    template: `

        <input [(ngModel)]="value" />

        <p>Value: {{ value }}</p>

    `,

})

export class TwoWayBindingComponent {

    value: string = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

63. ¿Cómo se utiliza el decorador `@HostBinding` de Angular?

El decorador `@HostBinding` se utiliza para vincular una propiedad del elemento host a una propiedad de la directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('class.highlight') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

64. ¿Cómo se utiliza el decorador `@HostListener` de Angular para escuchar eventos DOM?

El decorador `@HostListener` le permite escuchar eventos en el elemento host de la directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event']) onClick(event: Event) {

        console.log('Element clicked:', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

65. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnChanges` de Angular?

El gancho del ciclo de vida `ngOnChanges` responde a cambios en las propiedades de entrada.



import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';



@Component({

    selector: 'app-changes',

    template: `<p>{{ inputValue }}</p>`,

})

export class ChangesComponent implements OnChanges {

    @Input() inputValue: string;



    ngOnChanges(changes: SimpleChanges) {

        console.log('Changes:', changes);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

66. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnInit` de Angular?

El gancho del ciclo de vida `ngOnInit` se utiliza para la lógica de inicialización de componentes.



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



@Component({

    selector: 'app-init',

    template: `<p>Component initialized</p>`,

})

export class InitComponent implements OnInit {

    ngOnInit() {

        console.log('Component initialized');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

67. ¿Cómo se utiliza el gancho del ciclo de vida `ngAfterViewInit` de Angular?

El gancho del ciclo de vida `ngAfterViewInit` se utiliza después de que se hayan inicializado la vista del componente y las vistas secundarias.



import { Component, AfterViewInit, ViewChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-view-init',

    template: `<div #myDiv>Content</div>`,

})

export class ViewInitComponent implements AfterViewInit {

    @ViewChild('myDiv') div: ElementRef;



    ngAfterViewInit() {

        console.log(this.div.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

68. ¿Cómo se utiliza el gancho del ciclo de vida `ngAfterContentInit` de Angular?

El gancho del ciclo de vida `ngAfterContentInit` se utiliza después de que Angular inicializa el contenido del componente.



import { Component, AfterContentInit, ContentChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-content-init',

    template: `<ng-content></ng-content>`,

})

export class ContentInitComponent implements AfterContentInit {

    @ContentChild('content') content: ElementRef;



    ngAfterContentInit() {

        console.log(this.content.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

69. ¿Cómo se utiliza el gancho del ciclo de vida `ngAfterViewChecked` de Angular?

El gancho del ciclo de vida `ngAfterViewChecked` se usa después de que Angular verifica la vista del componente y las vistas secundarias.



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



@Component({

    selector: 'app-view-checked',

    template: `<p>Check view</p>`,

})

export class ViewCheckedComponent implements AfterViewChecked {

    ngAfterViewChecked() {

        console.log('View checked');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

70. ¿Cómo se utiliza el gancho del ciclo de vida `ngAfterContentChecked` de Angular?

El gancho del ciclo de vida `ngAfterContentChecked` se utiliza después de que Angular verifica el contenido proyectado en el componente.



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



@Component({

    selector: 'app-content-checked',

    template: `<p>Check content</p>`,

})

export class ContentCheckedComponent implements AfterContentChecked {

    ngAfterContentChecked() {

        console.log('Content checked');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

71. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnDestroy` de Angular para la limpieza?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para realizar la limpieza justo antes de que Angular destruya el componente.



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

import { Subscription } from 'rxjs';



@Component({

    selector: 'app-destroy',

    template: `<p>Component destroyed</p>`,

})

export class DestroyComponent implements OnDestroy {

    private subscription: Subscription;



    ngOnDestroy() {

        // Unsubscribe to avoid memory leaks

        if (this.subscription) {

            this.subscription.unsubscribe();

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

72. ¿Cómo se utiliza el decorador `@Input` de Angular para el enlace de entrada?

El decorador `@Input` permite pasar datos de un componente principal a un componente secundario.



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



@Component({

    selector: 'app-child',

    template: `<p>{{ data }}</p>`,

})

export class ChildComponent {

    @Input() data: string;

}



@Component({

    selector: 'app-parent',

    template: `<app-child [data]="parentData"></app-child>`,

})

export class ParentComponent {

    parentData = 'Data from parent';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

73. ¿Cómo se utiliza el decorador `@Output` de Angular para el enlace de salida?

El decorador `@Output` se utiliza para emitir eventos de un componente secundario a un componente principal.



import { Component, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="sendData()">Send Data</button>`,

})

export class ChildComponent {

    @Output() dataEvent = new EventEmitter<string>();



    sendData() {

        this.dataEvent.emit('Data from child');

    }

}



@Component({

    selector: 'app-parent',

    template: `

        <app-child (dataEvent)="receiveData($event)"></app-child>

        <p>{{ receivedData }}</p>

    `,

})

export class ParentComponent {

    receivedData: string;



    receiveData(data: string) {

        this.receivedData = data;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

74. ¿Cómo se utiliza el decorador `@ViewChild` de Angular para consultar un solo elemento?

El decorador `@ViewChild` permite consultar un solo elemento o directiva desde la vista del componente.



import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

    selector: 'app-view-child',

    template: `<div #myDiv>Content</div>`,

})

export class ViewChildComponent implements AfterViewInit {

    @ViewChild('myDiv') div: ElementRef;



    ngAfterViewInit() {

        console.log(this.div.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

75. ¿Cómo se utiliza `NgModule` de Angular para crear un módulo compartido?

Un módulo compartido le permite compartir funciones comunes entre varios módulos.



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

import { CommonModule } from '@angular/common';

import { SharedComponent } from './shared.component';



@NgModule({

    declarations: [SharedComponent],

    imports: [CommonModule],

    exports: [SharedComponent]

})

export class SharedModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

76. ¿Cómo se utiliza `@NgModule` de Angular para configurar rutas?

La configuración de enrutamiento se realiza en el decorador `@NgModule` con el método `RouterModule.forRoot`.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';

import { AboutComponent } from './about.component';



const routes: Routes = [

    { path: '', component: HomeComponent },

    { path: 'about', component: AboutComponent },

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

77. ¿Cómo se utiliza `ActivatedRoute` de Angular para acceder a los parámetros de ruta?

El servicio `ActivatedRoute` proporciona acceso a los parámetros de ruta de la ruta activa.



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

import { ActivatedRoute } from '@angular/router';



@Component({

    selector: 'app-route',

    template: `<p>Parameter: {{ param }}</p>`,

})

export class RouteComponent implements OnInit {

    param: string;



    constructor(private route: ActivatedRoute) {}



    ngOnInit() {

        this.route.paramMap.subscribe(params => {

            this.param = params.get('id');

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

78. ¿Cómo se utiliza la directiva `RouterLink` de Angular para la navegación?

La directiva `RouterLink` se utiliza para vincular un enlace a una ruta en el enrutador Angular.



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



@Component({

    selector: 'app-navigation',

    template: `

        <a routerLink="/home">Home</a>

        <a routerLink="/about">About</a>

    `,

})

export class NavigationComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

79. ¿Cómo se utiliza el servicio `Router` de Angular para la navegación programática?

El servicio `Router` le permite navegar mediante programación a diferentes rutas.



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

import { Router } from '@angular/router';



@Component({

    selector: 'app-navigation',

    template: `<button (click)="navigate()">Go to About</button>`,

})

export class NavigationComponent {

    constructor(private router: Router) {}



    navigate() {

        this.router.navigate(['/about']);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

80. ¿Cómo se utiliza `FormControl` de Angular para administrar las entradas del formulario?

La clase `FormControl` se utiliza para gestionar el valor y el estado de validación de las entradas del formulario.



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

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



@Component({

    selector: 'app-form',

    template: `

        <input [formControl]="nameControl" />

        <p>Value: {{ nameControl.value }}</p>

    `,

})

export class FormComponent {

    nameControl = new FormControl('');

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares intermedias - Parte 5

81. ¿Cómo se utiliza `FormArray` de Angular para administrar una serie de controles de formulario?

La clase `FormArray` se utiliza para administrar una serie de controles de formulario.



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

import { FormArray, FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-form-array',

    template: `

        <form [formGroup]="form">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i" />

                </div>

            </div>

            <button (click)="addItem()">Add Item</button>

        </form>

    `,

})

export class FormArrayComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            items: this.fb.array([this.fb.control('')])

        });

    }



    get items() {

        return this.form.get('items') as FormArray;

    }



    addItem() {

        this.items.push(this.fb.control(''));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

82. ¿Cómo se utilizan `ReactiveForms` de Angular para crear un formulario con validación?

Los formularios reactivos le permiten crear formularios con validación usando las clases `FormControl` y `FormGroup`.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

        <form [formGroup]="form" (ngSubmit)="onSubmit()">

            <input formControlName="name" placeholder="Name" />

            <div *ngIf="form.controls.name.invalid && form.controls.name.touched">

                Name is required

            </div>

            <button type="submit" [disabled]="form.invalid">Submit</button>

        </form>

    `,

})

export class ReactiveFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['', Validators.required]

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

83. ¿Cómo se utiliza `FormBuilder` de Angular para crear un formulario con controles anidados?

La clase `FormBuilder` ayuda a crear formularios complejos con controles anidados.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-nested-form',

    template: `

        <form [formGroup]="form">

            <div formGroupName="address">

                <input formControlName="street" placeholder="Street" />

                <input formControlName="city" placeholder="City" />

            </div>

        </form>

    `,

})

export class NestedFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            address: this.fb.group({

                street: [''],

                city: ['']

            })

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

84. ¿Cómo se utilizan los `Validadores` de Angular para agregar validación personalizada?

Puede crear validadores personalizados y usarlos con controles de formulario.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-custom-validation',

    template: `

        <form [formGroup]="form">

            <input formControlName="password" placeholder="Password" />

            <div *ngIf="form.controls.password.errors?.pattern">

                Password must contain at least one uppercase letter

            </div>

        </form>

    `,

})

export class CustomValidationComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            password: ['', [Validators.required, this.uppercaseValidator]]

        });

    }



    uppercaseValidator(control) {

        const hasUppercase = /[A-Z]/.test(control.value);

        return hasUppercase ? null : { pattern: true };

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

85. ¿Cómo se utiliza `AsyncValidator` de Angular para la validación asincrónica?

Los validadores asincrónicos se utilizan para realizar validaciones que requieren una solicitud HTTP u otras operaciones asincrónicas.



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

import { FormBuilder, FormGroup, AsyncValidatorFn, AbstractControl } from '@angular/forms';

import { Observable, de } from 'rxjs';

import { debounceTime, map, catchError } from 'rxjs/operators';



@Component({

    selector: 'app-async-validator',

    template: `

        <form [formGroup]="form">

            <input formControlName="username" placeholder="Username" />

            <div *ngIf="form.controls.username.errors?.taken">

                Username is taken

            </div>

        </form>

    `,

})

export class AsyncValidatorComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            username: ['', null, this.usernameValidator()]

        });

    }



    usernameValidator(): AsyncValidatorFn {

        return (control: AbstractControl): Observable<any> => {

            return of(control.value).pipe(

                debounceTime(300),

                map(value => value === 'admin' ? { taken: true } : null),

                catchError(() => of(null))

            );

        };

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

86. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP?

El servicio `HttpClient` se utiliza para realizar solicitudes HTTP.



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

import { HttpClient } from '@angular/common/http';



@Component({

    selector: 'app-http',

    template: `

        <p>Data: {{ data | json }}</p>

    `,

})

export class HttpComponent implements OnInit {

    data: any;



    constructor(private http: HttpClient) {}



    ngOnInit() {

        this.http.get('https://api.example.com/data').subscribe(response => {

            this.data = response;

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

87. ¿Cómo se utiliza `HttpInterceptor` de Angular para modificar solicitudes HTTP?

El `HttpInterceptor` le permite interceptar y modificar solicitudes y respuestas HTTP.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const cloned = req.clone({

            setHeaders: {

                Authorization: 'Bearer my-token'

            }

        });

        return next.handle(cloned);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

88. ¿Cómo se utilizan `HttpParams` de Angular para crear parámetros de consulta?

La clase `HttpParams` se utiliza para crear parámetros de consulta para solicitudes HTTP.



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

import { HttpClient, HttpParams } from '@angular/common/http';



@Component({

    selector: 'app-http-params',

    template: `

        <p>Data: {{ data | json }}</p>

    `,

})

export class HttpParamsComponent implements OnInit {

    data: any;



    constructor(private http: HttpClient) {}



    ngOnInit() {

        const params = new HttpParams().set('param1', 'value1').set('param2', 'value2');

        this.http.get('https://api.example.com/data', { params }).subscribe(response => {

            this.data = response;

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

89. ¿Cómo se utiliza `NgModel` de Angular para el enlace de datos bidireccional?

La directiva `NgModel` se utiliza para el enlace de datos bidireccional en formularios angulares.



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



@Component({

    selector: 'app-ng-model',

    template: `

        <input [(ngModel)]="name" placeholder="Name" />

        <p>Name: {{ name }}</p>

    `,

})

export class NgModelComponent {

    name: string = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

90. ¿Cómo se utiliza el `Custom Pipe` de Angular para transformar datos?

Las canalizaciones personalizadas le permiten transformar datos antes de mostrarlos en la plantilla.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

91. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos DOM?

El decorador `@HostListener` le permite escuchar eventos DOM en su componente o directiva.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appHover]'

})

export class HoverDirective {

    @HostListener('mouseenter') onMouseEnter() {

        console.log('Mouse entered');

    }



    @HostListener('mouseleave') onMouseLeave() {

        console.log('Mouse left');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

92. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado?

El decorador `@ContentChild` se utiliza para acceder a un único elemento secundario proyectado en un componente.



import { Component, ContentChild, AfterContentInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-content-child',

    template: `<ng-content></ng-content>`,

})

export class ContentChildComponent implements AfterContentInit {

    @ContentChild('content') content: ElementRef;



    ngAfterContentInit() {

        console.log(this.content.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

93. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

El servicio `ChangeDetectorRef` le permite activar manualmente la detección de cambios.



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



@Component({

    selector: 'app-detection',

    template: `

        <p>{{ message }}</p>

        <button (click)="updateMessage()">Update Message</button>

    `,

})

export class DetectionComponent {

    message: string = 'Initial Message';



    constructor(private cd: ChangeDetectorRef) {}



    updateMessage() {

        this.message = 'Updated Message';

        this.cd.detectChanges();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

94. ¿Cómo se utiliza el decorador `@Injectable` de Angular para crear un servicio?

El decorador `@Injectable` se utiliza para crear un servicio que se puede inyectar en otros componentes o servicios.



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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    getData() {

        return ['Item1', 'Item2', 'Item3'];

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

95. ¿Cómo se utiliza `@NgModule` de Angular para configurar proveedores?

Los proveedores se pueden configurar en el decorador `@NgModule` para que estén disponibles en toda la aplicación o módulo.



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

import { CommonModule } from '@angular/common';

import { DataService } from './data.service';



@NgModule({

    imports: [CommonModule],

    providers: [DataService]

})

export class SharedModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

96. ¿Cómo se utiliza el `ng-content` de Angular para proyectar contenido en un componente?

La directiva `ng-content` se utiliza para proyectar contenido en la plantilla de un componente.



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



@Component({

    selector: 'app-content',

    template: `<ng-content></ng-content>`,

})

export class ContentComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

97. ¿Cómo se utiliza el decorador `@Inject` de Angular para la inyección de dependencias?

El decorador `@Inject` le permite especificar una dependencia que se inyectará en un componente o servicio.



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

import { DOCUMENT } from '@angular/common';



@Component({

    selector: 'app-doc',

    template: `<p>Document title: {{ title }}</p>`,

})

export class DocComponent {

    title: string;



    constructor(@Inject(DOCUMENT) private document: Document) {

        this.title = this.document.title;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

98. ¿Cómo se utiliza `@HostBinding` de Angular para vincular propiedades a un elemento host?

El decorador `@HostBinding` se utiliza para vincular propiedades al elemento host de una directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('class.highlighted') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

99. ¿Cómo se utiliza el decorador `@Host` de Angular para la inyección de dependencia?

El decorador `@Host` le permite inyectar una dependencia desde el elemento host.



import { Directive, Host } from '@angular/core';

import { DataService } from './data.service';



@Directive({

    selector: '[appHost]',

})

export class HostDirective {

    constructor(@Host() private dataService: DataService) {

        console.log(this.dataService.getData());

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

100. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnInit` de Angular?

El gancho del ciclo de vida `ngOnInit` se utiliza para realizar la lógica de inicialización después de que Angular haya inicializado las propiedades vinculadas a datos del componente.



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



@Component({

    selector: 'app-init',

    template: `<p>Component initialized</p>`,

})

export class InitComponent implements OnInit {

    ngOnInit() {

        console.log('Component initialized');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares intermedias - Parte 6

101. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnDestroy` de Angular para limpiar recursos?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para realizar la limpieza justo antes de que Angular destruya el componente o directiva.



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

import { Subscription } from 'rxjs';



@Component({

    selector: 'app-destroy',

    template: `<p>Component is being destroyed</p>`,

})

export class DestroyComponent implements OnDestroy {

    private subscription: Subscription = new Subscription();



    ngOnDestroy() {

        this.subscription.unsubscribe();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

102. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a un componente o elemento secundario?

El decorador `@ViewChild` le permite acceder a un componente secundario o elemento dentro del componente principal.



import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

    selector: 'app-view-child',

    template: `<p #paragraph>Some text</p>`,

})

export class ViewChildComponent implements AfterViewInit {

    @ViewChild('paragraph') paragraph: ElementRef;



    ngAfterViewInit() {

        console.log(this.paragraph.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

103. ¿Cómo se utiliza `@ContentChildren` de Angular para acceder a múltiples elementos de contenido proyectados?

El decorador `@ContentChildren` se utiliza para acceder a múltiples elementos secundarios proyectados en un componente.



import { Component, ContentChildren, QueryList, AfterContentInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-content-children',

    template: `<ng-content></ng-content>`,

})

export class ContentChildrenComponent implements AfterContentInit {

    @ContentChildren('content') contents: QueryList<ElementRef>;



    ngAfterContentInit() {

        this.contents.forEach(content => {

            console.log(content.nativeElement.textContent);

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

104. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnChanges` de Angular para responder a los cambios de propiedad de entrada?

El gancho del ciclo de vida `ngOnChanges` le permite responder a los cambios en las propiedades de entrada.



import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';



@Component({

    selector: 'app-changes',

    template: `<p>{{ value }}</p>`,

})

export class ChangesComponent implements OnChanges {

    @Input() value: string;



    ngOnChanges(changes: SimpleChanges) {

        console.log('Changes:', changes);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

105. ¿Cómo se utiliza `ngFor` de Angular para recorrer una matriz en una plantilla?

La directiva `ngFor` se utiliza para iterar sobre matrices o colecciones en plantillas Angular.



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



@Component({

    selector: 'app-ng-for',

    template: `

        <ul>

            <li *ngFor="let item de items">{{ item }}</li>

        </ul>

    `,

})

export class NgForComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

106. ¿Cómo se utiliza `ngIf` de Angular para mostrar elementos condicionalmente?

La directiva `ngIf` incluye o excluye condicionalmente elementos del DOM.



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



@Component({

    selector: 'app-ng-if',

    template: `

        <div *ngIf="isVisible">This is visible</div>

    `,

})

export class NgIfComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

107. ¿Cómo se utiliza `ngClass` de Angular para aplicar clases CSS de forma condicional?

La directiva `ngClass` se utiliza para agregar o eliminar dinámicamente clases CSS basadas en expresiones.



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



@Component({

    selector: 'app-ng-class',

    template: `

        <div [ngClass]="{'active': isActive, 'inactive': !isActive}">

            Conditional classes

        </div>

    `,

})

export class NgClassComponent {

    isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

108. ¿Cómo se utiliza `ngStyle` de Angular para aplicar estilos en línea de forma condicional?

La directiva `ngStyle` le permite aplicar estilos en línea condicionalmente basados en expresiones.



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



@Component({

    selector: 'app-ng-style',

    template: `

        <div [ngStyle]="{'color': color, 'font-size': fontSize}">

            Styled text

        </div>

    `,

})

export class NgStyleComponent {

    color = 'blue';

    fontSize = '20px';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

109. ¿Cómo se utiliza `@Pipe` de Angular para crear una tubería personalizada?

El decorador `@Pipe` se utiliza para crear canalizaciones personalizadas para transformar datos en plantillas.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'uppercase'

})

export class UppercasePipe implements PipeTransform {

    transform(value: string): string {

        return value.toUpperCase();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

110. ¿Cómo se utiliza `ngModel` de Angular con enlace de datos bidireccional en un formulario?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional en formularios angulares.



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



@Component({

    selector: 'app-ng-model',

    template: `

        <input [(ngModel)]="name" placeholder="Name" />

        <p>Name: {{ name }}</p>

    `,

})

export class NgModelComponent {

    name: string = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

111. ¿Cómo se utilizan `ReactiveForms` de Angular para manejar los envíos de formularios?

Los formularios reactivos proporcionan una manera de manejar los envíos de formularios con más control sobre la validación y el estado.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

        <form [formGroup]="form" (ngSubmit)="onSubmit()">

            <input formControlName="name" placeholder="Name" />

            <button type="submit">Submit</button>

        </form>

    `,

})

export class ReactiveFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['']

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

112. ¿Cómo se utiliza `FormBuilder` de Angular para crear un grupo de formularios?

El servicio `FormBuilder` se utiliza para crear grupos de formularios en forma reactiva.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-form-builder',

    template: `

        <form [formGroup]="form">

            <input formControlName="email" placeholder="Email" />

        </form>

    `,

})

export class FormBuilderComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            email: ['']

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

113. ¿Cómo se utiliza `HttpInterceptor` de Angular para interceptar solicitudes HTTP?

La interfaz `HttpInterceptor` le permite interceptar y modificar solicitudes y respuestas HTTP.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const authReq = req.clone({

            headers: req.headers.set('Authorization', 'Bearer my-token')

        });

        return next.handle(authReq);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

114. ¿Cómo se utiliza `HttpClient` de Angular para manejar errores en solicitudes HTTP?

El servicio `HttpClient` proporciona métodos para manejar errores utilizando operadores RxJS.



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

import { HttpClient } from '@angular/common/http';

import { catchError } from 'rxjs/operators';

import { de } from 'rxjs';



@Component({

    selector: 'app-http-error',

    template: `<p>Check console for errors</p>`,

})

export class HttpErrorComponent {

    constructor(private http: HttpClient) {

        this.http.get('https://api.example.com/data')

            .pipe(catchError(error => {

                console.error('Error occurred:', error);

                return of([]);

            }))

            .subscribe(response => {

                console.log(response);

            });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

115. ¿Cómo se utiliza `@Directive` de Angular para crear una directiva personalizada?

El decorador `@Directive` se utiliza para crear directivas personalizadas que pueden manipular el DOM.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) {}



    @HostListener('mouseenter') onMouseEnter() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.renderer.removeStyle(this.el.nativeElement, 'backgroundColor');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

116. ¿Cómo se utiliza `Renderer2` de Angular para interactuar con el DOM?

El servicio `Renderer2` le permite interactuar con el DOM de forma segura.



import { Directive, Renderer2, ElementRef } from '@angular/core';



@Directive({

    selector: '[appColor]'

})

export class ColorDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) {

        this.renderer.setStyle(this.el.nativeElement, 'color', 'blue');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

117. ¿Cómo se utiliza `@ViewChildren` de Angular para consultar múltiples elementos o componentes?

El decorador `@ViewChildren` le permite consultar y acceder a múltiples elementos o componentes secundarios.



import { Component, ViewChildren, QueryList, AfterViewInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-view-children',

    template: `<div #item *ngFor="let i de items">{{ i }}</div>`,

})

export class ViewChildrenComponent implements AfterViewInit {

    @ViewChildren('item') items: QueryList<ElementRef>;



    ngAfterViewInit() {

        this.items.forEach(item => {

            console.log(item.nativeElement.textContent);

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

118. ¿Cómo se utiliza `@NgModule` de Angular para crear módulos de funciones?

Los módulos de funciones se crean utilizando el decorador `@NgModule` para agrupar componentes, directivas y servicios relacionados.



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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';



@NgModule({

    imports: [CommonModule],

    declarations: [FeatureComponent],

    exports: [FeatureComponent]

})

export class FeatureModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

119. ¿Cómo se utiliza el `RouterModule` de Angular para configurar rutas?

El `RouterModule` se utiliza para configurar rutas y navegación en una aplicación Angular.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';

import { AboutComponent } from './about.component';



const routes: Routes = [

    { path: 'home', component: HomeComponent },

    { path: 'about', component: AboutComponent },

    { path: '', redirectTo: '/home', pathMatch: 'full' }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

120. ¿Cómo se utiliza `ActivatedRoute` de Angular para obtener parámetros de ruta?

El servicio `ActivatedRoute` le permite acceder a los parámetros de ruta en su componente.



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

import { ActivatedRoute } from '@angular/router';



@Component({

    selector: 'app-route-params',

    template: `<p>Route ID: {{ id }}</p>`,

})

export class RouteParamsComponent implements OnInit {

    id: string;



    constructor(private route: ActivatedRoute) {}



    ngOnInit() {

        this.route.paramMap.subscribe(params => {

            this.id = params.get('id');

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares intermedias - Parte 7

121. ¿Cómo se utiliza `HttpClient` de Angular para enviar una solicitud POST con datos JSON?

El servicio `HttpClient` puede enviar solicitudes POST con datos JSON utilizando el método `post`.



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

import { HttpClient } from '@angular/common/http';



@Component({

    selector: 'app-post-request',

    template: `<p>Check console for response</p>`,

})

export class PostRequestComponent {

    constructor(private http: HttpClient) {

        this.http.post('https://api.example.com/data', { key: 'value' })

            .subscribe(response => {

                console.log(response);

            });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

122. ¿Cómo se utiliza `FormArray` de Angular para administrar una serie de controles de formulario?

La clase `FormArray` le permite administrar una serie de controles de formulario en forma reactiva.



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

import { FormBuilder, FormGroup, FormArray } from '@angular/forms';



@Component({

    selector: 'app-form-array',

    template: `

        <form [formGroup]="form">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i" />

                </div>

            </div>

        </form>

    `,

})

export class FormArrayComponent {

    form: FormGroup;



    get items() {

        return this.form.get('items') as FormArray;

    }



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            items: this.fb.array(['', '', ''])

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

123. ¿Cómo se utilizan `HttpParams` de Angular para agregar parámetros de consulta a una solicitud HTTP?

La clase `HttpParams` se utiliza para construir parámetros de consulta para una solicitud HTTP.



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

import { HttpClient, HttpParams } from '@angular/common/http';



@Component({

    selector: 'app-http-params',

    template: `<p>Check console for response</p>`,

})

export class HttpParamsComponent {

    constructor(private http: HttpClient) {

        const params = new HttpParams().set('param1', 'value1').set('param2', 'value2');

        this.http.get('https://api.example.com/data', { params })

            .subscribe(response => {

                console.log(response);

            });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

124. ¿Cómo se utiliza `@HostBinding` de Angular para vincular las propiedades del elemento host?

El decorador `@HostBinding` le permite vincular propiedades del elemento host en una directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('class.highlighted') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

125. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos en el elemento host?

El decorador `@HostListener` le permite escuchar eventos en el elemento host en una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appHover]'

})

export class HoverDirective {

    @HostListener('mouseenter') onMouseEnter() {

        console.log('Mouse entered');

    }



    @HostListener('mouseleave') onMouseLeave() {

        console.log('Mouse left');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

126. ¿Cómo se utiliza `@Inject` de Angular para inyectar dependencias en un servicio?

El decorador `@Inject` se utiliza para especificar una dependencia que se inyectará en un servicio o componente.



import { Injectable, Inject } from '@angular/core';

import { MyService } from './my-service.service';



@Injectable({

    providedIn: 'root'

})

export class MyComponentService {

    constructor(@Inject(MyService) private myService: MyService) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

127. ¿Cómo se utiliza `@Optional` de Angular para hacer que la inyección de dependencia sea opcional?

El decorador `@Optional` le permite especificar que una dependencia es opcional.



import { Injectable, Optional } from '@angular/core';

import { OptionalService } from './optional.service';



@Injectable({

    providedIn: 'root'

})

export class MyService {

    constructor(@Optional() private optionalService?: OptionalService) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

128. ¿Cómo se utiliza `@Self` de Angular para especificar que una dependencia debe resolverse desde el mismo inyector?

El decorador `@Self` garantiza que una dependencia se resuelva desde el mismo inyector, no desde los inyectores principales.



import { Injectable, Self } from '@angular/core';

import { MyService } from './my-service.service';



@Injectable({

    providedIn: 'root'

})

export class AnotherService {

    constructor(@Self() private myService: MyService) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

129. ¿Cómo se utiliza `@Attribute` de Angular para acceder al valor de un atributo en el elemento host?

El decorador `@Attribute` le permite acceder al valor de un atributo en el elemento host.



import { Directive, Attribute } from '@angular/core';



@Directive({

    selector: '[appAttribute]'

})

export class AttributeDirective {

    constructor(@Attribute('data-attribute') private dataAttribute: string) {

        console.log(dataAttribute);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

130. ¿Cómo se utiliza `NgModule` de Angular para declarar e importar módulos?

El decorador `@NgModule` se utiliza para declarar e importar módulos en una aplicación Angular.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

131. ¿Cómo se utiliza `@NgModule` de Angular para proporcionar servicios a nivel de módulo?

La matriz `proveedores` en `@NgModule` le permite especificar los servicios que estarán disponibles a nivel de módulo.



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

import { AppComponent } from './app.component';

import { MyService } from './my-service.service';



@NgModule({

    declarations: [AppComponent],

    imports: [],

    providers: [MyService],

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

132. ¿Cómo se utiliza `@Pipe` de Angular para crear una tubería personalizada?

El decorador `@Pipe` se utiliza para crear canalizaciones personalizadas que pueden transformar datos en plantillas.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

133. ¿Cómo se utiliza `@Injectable` de Angular para crear un servicio?

El decorador `@Injectable` se utiliza para definir un servicio que se puede inyectar en otros componentes o servicios.



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



@Injectable({

    providedIn: 'root'

})

export class MyService {

    constructor() {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

134. ¿Cómo se utiliza `@Component` de Angular para crear un componente reutilizable?

El decorador `@Component` se utiliza para definir un componente reutilizable en Angular.



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



@Component({

    selector: 'app-reusable',

    template: `<p>This is a reusable component</p>`,

})

export class ReusableComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

135. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a un componente secundario?

El decorador `@ViewChild` le permite acceder y manipular un componente secundario o elemento DOM.



import { Component, ViewChild, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<app-child></app-child>`,

})

export class ParentComponent implements AfterViewInit {

    @ViewChild(ChildComponent) child: ChildComponent;



    ngAfterViewInit() {

        console.log(this.child);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

136. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado en un componente?

El decorador `@ContentChild` le permite acceder y manipular el contenido proyectado en un componente.



import { Component, ContentChild, AfterContentInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-content',

    template: `<ng-content></ng-content>`,

})

export class ContentComponent implements AfterContentInit {

    @ContentChild('content') content: ElementRef;



    ngAfterContentInit() {

        console.log(this.content.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

137. ¿Cómo se utiliza `@NgModule` de Angular para exportar componentes desde un módulo?

La matriz `exports` en `@NgModule` le permite especificar qué componentes, directivas y canalizaciones deben estar disponibles para otros módulos.



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

import { CommonModule } from '@angular/common';

import { SharedComponent } from './shared.component';



@NgModule({

    imports: [CommonModule],

    declarations: [SharedComponent],

    exports: [SharedComponent]

})

export class SharedModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

138. ¿Cómo se utiliza `@Inject` de Angular para proporcionar un valor de token específico?

El decorador `@Inject` le permite proporcionar un valor de token específico para la inyección de dependencia.



import { Injectable, Inject, InjectionToken } from '@angular/core';



export const API_URL = new InjectionToken<string>('apiUrl');



@Injectable({

    providedIn: 'root'

})

export class ApiService {

    constructor(@Inject(API_URL) private apiUrl: string) {

        console.log(apiUrl);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

139. ¿Cómo se utiliza `@Directive` de Angular para crear una directiva estructural?

El decorador `@Directive` se utiliza para crear una directiva estructural que puede cambiar el diseño del DOM.



import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';



@Directive({

    selector: '[appIf]'

})

export class IfDirective {

    constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) {}



    @Input() set appIf(condition: boolean) {

        if (condition) {

            this.viewContainer.createEmbeddedView(this.templateRef);

        } else {

            this.viewContainer.clear();

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

140. ¿Cómo se utiliza `@NgModule` de Angular para configurar proveedores con `forRoot` y `forChild`?

Los métodos `forRoot` y `forChild` se utilizan para configurar proveedores para módulos raíz y de funciones, respectivamente.



import { NgModule, ModuleWithProviders } from '@angular/core';

import { CommonModule } from '@angular/common';

import { MyService } from './my-service.service';



@NgModule({

    imports: [CommonModule],

    declarations: [],

    exports: []

})

export class FeatureModule {

    static forRoot(): ModuleWithProviders<FeatureModule> {

        return {

            ngModule: FeatureModule,

            providers: [MyService]

        };

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares intermedias - Parte 8

141. ¿Cómo se utiliza `BehaviorSubject` de Angular para la gestión estatal?

El `BehaviorSubject` se utiliza para gestionar el estado en Angular. Mantiene el valor actual y lo emite a nuevos suscriptores.



import { BehaviorSubject } from 'rxjs';



export class StateService {

    private stateSubject = new BehaviorSubject<number>(0);

    state$ = this.stateSubject.asObservable();



    updateState(value: number) {

        this.stateSubject.next(value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

142. ¿Cómo se implementa la estrategia de detección de cambios `OnPush` de Angular?

La estrategia `OnPush` mejora el rendimiento al verificar solo los cambios cuando cambian las propiedades de entrada o cuando ocurre un evento.



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



@Component({

    selector: 'app-onpush',

    template: `<p>OnPush change detection</p>`,

    changeDetection: ChangeDetectionStrategy.OnPush

})

export class OnPushComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

143. ¿Cómo se utiliza `@ViewEncapsulation` de Angular para controlar la encapsulación de CSS?

El decorador `@ViewEncapsulation` se utiliza para controlar cómo se aplican los estilos a los componentes.



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



@Component({

    selector: 'app-encapsulation',

    template: `<p>ViewEncapsulation example</p>`,

    styles: [`p { color: red; }`],

    encapsulation: ViewEncapsulation.None

})

export class EncapsulationComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

144. ¿Cómo se utiliza la "Ruta" de Angular con guardias de ruta?

Los guardias de ruta controlan el acceso a las rutas según las condiciones.



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

import { CanActivate, Router } from '@angular/router';



@Injectable({

    providedIn: 'root'

})

export class AuthGuard implements CanActivate {

    constructor(private router: Router) {}



    canActivate(): boolean {

        const isAuthenticated = false; // Replace with real authentication logic

        if (isAuthenticated) {

            return true;

        } else {

            this.router.navigate(['/login']);

            return false;

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

145. ¿Cómo se crea una tubería angular personalizada que acepta argumentos?

Las canalizaciones personalizadas pueden transformar datos según los argumentos proporcionados.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'multiply'

})

export class MultiplyPipe implements PipeTransform {

    transform(value: number, multiplier: number): number {

        return value * multiplier;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

146. ¿Cómo se utiliza `FormBuilder` de Angular para crear grupos de formularios anidados?

El servicio `FormBuilder` se puede utilizar para crear formularios complejos con grupos de formularios anidados.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-nested-form',

    template: `

        <form [formGroup]="form">

            <div formGroupName="personalInfo">

                <input formControlName="name" placeholder="Name">

                <input formControlName="age" placeholder="Age">

            </div>

            <div formGroupName="address">

                <input formControlName="street" placeholder="Street">

                <input formControlName="city" placeholder="City">

            </div>

        </form>

    `,

})

export class NestedFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            personalInfo: this.fb.group({

                name: [''],

                age: ['']

            }),

            address: this.fb.group({

                street: [''],

                city: ['']

            })

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

147. ¿Cómo se utiliza `@NgModule` de Angular para configurar módulos con carga diferida?

Los módulos de carga diferida se pueden configurar en `@NgModule` usando la propiedad `loadChildren` en las rutas.



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

import { RouterModule, Routes } from '@angular/router';



const routes: Routes = [

    { path: 'lazy', loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

148. ¿Cómo se utiliza `@NgModule` de Angular para proporcionar un servicio singleton?

Proporcionar un servicio en `@NgModule` garantiza que sea un producto único en toda la aplicación.



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

import { AppComponent } from './app.component';

import { MyService } from './my-service.service';



@NgModule({

    declarations: [AppComponent],

    imports: [],

    providers: [MyService], // Singleton service

    bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

149. ¿Cómo se utiliza `HttpInterceptor` de Angular para modificar solicitudes y respuestas HTTP?

El `HttpInterceptor` le permite interceptar y modificar solicitudes y respuestas HTTP.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const clonedRequest = req.clone({

            headers: req.headers.set('Authorization', 'Bearer token')

        });

        return next.handle(clonedRequest);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

150. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

El servicio `ChangeDetectorRef` le permite activar manualmente la detección de cambios en sus componentes.



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



@Component({

    selector: 'app-manual-detect',

    template: `<p>Manual change detection</p>`,

})

export class ManualDetectComponent {

    constructor(private cdr: ChangeDetectorRef) {}



    triggerChangeDetection() {

        this.cdr.detectChanges();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

151. ¿Cómo se utiliza `Renderer2` de Angular para manipular el DOM?

El servicio `Renderer2` proporciona métodos para manipular el DOM de forma independiente de la plataforma.



import { Directive, Renderer2, ElementRef } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private renderer: Renderer2, private el: ElementRef) {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

152. ¿Cómo se utiliza `NgFor` de Angular para iterar sobre una matriz de objetos?

La directiva `NgFor` se utiliza para recorrer una serie de objetos en la plantilla.



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



@Component({

    selector: 'app-item-list',

    template: `

        <ul>

            <li *ngFor="let item de items">{{ item.name }}</li>

        </ul>

    `,

})

export class ItemListComponent {

    items = [{ name: 'Item 1' }, { name: 'Item 2' }, { name: 'Item 3' }];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

153. ¿Cómo se utiliza `NgIf` de Angular para representar elementos condicionalmente?

La directiva `NgIf` le permite incluir o excluir elementos del DOM de forma condicional.



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



@Component({

    selector: 'app-conditional',

    template: `

        <p *ngIf="isVisible">This element is conditionally rendered</p>

    `,

})

export class ConditionalComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

154. ¿Cómo se utiliza `FormArray` de Angular para manejar controles de formulario dinámicos?

`FormArray` le permite administrar una lista dinámica de controles de formulario.



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

import { FormBuilder, FormArray, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-dynamic-form',

    template: `

        <form [formGroup]="form">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i" placeholder="Item {{i + 1}}">

                </div>

            </div>

            <button (click)="addItem()">Add Item</button>

        </form>

    `,

})

export class DynamicFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            items: this.fb.array([])

        });

    }



    get items() {

        return this.form.get('items') as FormArray;

    }



    addItem() {

        this.items.push(this.fb.control(''));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

155. ¿Cómo se utiliza `@HostListener` de Angular para manejar eventos DOM?

El decorador `@HostListener` le permite escuchar eventos DOM directamente en su componente.



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



@Component({

    selector: 'app-host-listener',

    template: `<p>HostListener example</p>`,

})

export class HostListenerComponent {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Element clicked!', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

156. ¿Cómo se utiliza `ngOnChanges` de Angular para responder a los cambios de propiedad de entrada?

El gancho del ciclo de vida `ngOnChanges` se utiliza para responder a cambios en las propiedades de entrada.



import { Component, OnChanges, SimpleChanges, Input } from '@angular/core';



@Component({

    selector: 'app-changes',

    template: `<p>ngOnChanges example</p>`,

})

export class ChangesComponent implements OnChanges {

    @Input() data: string;



    ngOnChanges(changes: SimpleChanges) {

        console.log('Changes detected:', changes);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

157. ¿Cómo se utiliza `ngOnInit` de Angular para inicializar los datos del componente?

El gancho del ciclo de vida `ngOnInit` se utiliza para realizar tareas de inicialización del componente.



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



@Component({

    selector: 'app-init',

    template: `<p>ngOnInit example</p>`,

})

export class InitComponent implements OnInit {

    data: string;



    ngOnInit() {

        this.data = 'Initialized data';

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

158. ¿Cómo se utiliza `ngOnDestroy` de Angular para limpiar recursos?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para realizar tareas de limpieza antes de que se destruya el componente.



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

import { Subscription } from 'rxjs';



@Component({

    selector: 'app-destroy',

    template: `<p>ngOnDestroy example</p>`,

})

export class DestroyComponent implements OnDestroy {

    private subscription: Subscription;



    ngOnDestroy() {

        if (this.subscription) {

            this.subscription.unsubscribe();

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

159. ¿Cómo se utilizan `@Input` y `@Output` de Angular para comunicarse entre los componentes padre e hijo?

El decorador `@Input` permite que un componente secundario reciba datos de un padre, mientras que `@Output` permite que el niño emita eventos al padre.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `

        <button (click)="sendMessage()">Send Message</button>

    `,

})

export class ChildComponent {

    @Input() message: string;

    @Output() messageEvent = new EventEmitter<string>();



    sendMessage() {

        this.messageEvent.emit('Message from child');

    }

}



@Component({

    selector: 'app-parent',

    template: `

        <app-child [message]="parentMessage" (messageEvent)="receiveMessage($event)"></app-child>

        <p>Received Message: {{ receivedMessage }}</p>

    `,

})

export class ParentComponent {

    parentMessage = 'Message from parent';

    receivedMessage: string;



    receiveMessage(message: string) {

        this.receivedMessage = message;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

160. ¿Cómo se utiliza `ngSwitch` de Angular para mostrar elementos condicionalmente en función de un valor?

La directiva `ngSwitch` le permite mostrar elementos condicionalmente según un valor.



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



@Component({

    selector: 'app-switch',

    template: `

        <div [ngSwitch]="value">

            <p *ngSwitchCase="'A'">Value is A</p>

            <p *ngSwitchCase="'B'">Value is B</p>

            <p *ngSwitchDefault>Default value</p>

        </div>

    `,

})

export class SwitchComponent {

    value = 'A';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares intermedias - Parte 9

161. ¿Cómo se utiliza el decorador `@Injectable` de Angular para proporcionar un servicio en un nivel específico?

El decorador `@Injectable` se utiliza para marcar una clase como un servicio que se puede inyectar. Puede especificar el proveedor en `@NgModule` o directamente en el componente.



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



@Injectable({

    providedIn: 'root' // Singleton service provided at the root level

})

export class MyService {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

162. ¿Cómo se utiliza `@ContentChild` de Angular para acceder a un componente secundario proyectado en un espacio de contenido?

El decorador `@ContentChild` se utiliza para acceder a un componente secundario o directiva que se proyecta en un espacio de contenido.



import { Component, ContentChild, AfterContentInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<ng-content></ng-content>`

})

export class ParentComponent implements AfterContentInit {

    @ContentChild(ChildComponent) child: ChildComponent;



    ngAfterContentInit() {

        console.log(this.child);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

163. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a un componente secundario dentro de la vista?

El decorador `@ViewChild` se utiliza para acceder a un componente secundario o directiva dentro de la vista.



import { Component, ViewChild, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

    selector: 'app-parent',

    template: `<app-child></app-child>`

})

export class ParentComponent implements AfterViewInit {

    @ViewChild(ChildComponent) child: ChildComponent;



    ngAfterViewInit() {

        console.log(this.child);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

164. ¿Cómo se utiliza `ngModel` de Angular para vincular controles de formulario a las propiedades de los componentes?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional con controles de formulario.



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



@Component({

    selector: 'app-model',

    template: `<input [(ngModel)]="value" placeholder="Enter value"> <p>{{ value }}</p>`

})

export class ModelComponent {

    value: string = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

165. ¿Cómo se utiliza `AsyncPipe` de Angular para manejar datos asincrónicos?

`AsyncPipe` se suscribe a un observable o promesa y devuelve el último valor que ha emitido.



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

import { Observable, de } from 'rxjs';



@Component({

    selector: 'app-async',

    template: `<p>{{ data$ | async }}</p>`

})

export class AsyncComponent {

    data$: Observable<string> = of('Hello World');

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

166. ¿Cómo se utiliza `ngClass` de Angular para aplicar clases CSS dinámicas?

La directiva `ngClass` le permite agregar o eliminar dinámicamente clases CSS según el estado del componente.



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



@Component({

    selector: 'app-class',

    template: `<div [ngClass]="{'active': isActive, 'inactive': !isActive}">Dynamic Class</div>`

})

export class ClassComponent {

    isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

167. ¿Cómo se utiliza `ngStyle` de Angular para aplicar estilos dinámicos en línea?

La directiva `ngStyle` le permite establecer dinámicamente estilos en línea en un elemento.



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



@Component({

    selector: 'app-style',

    template: `<div [ngStyle]="{ 'color': color, 'font-size': fontSize }">Styled Text</div>`

})

export class StyleComponent {

    color = 'blue';

    fontSize = '20px';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

168. ¿Cómo se utiliza `ngFor` de Angular con una función trackBy para optimizar el renderizado?

La función `trackBy` ayuda a Angular a optimizar la representación mediante el seguimiento de elementos en una lista.



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



@Component({

    selector: 'app-trackby',

    template: `

        <ul>

            <li *ngFor="let item de items; trackBy: trackByFn">{{ item.name }}</li>

        </ul>

    `

})

export class TrackByComponent {

    items = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }];



    trackByFn(index: number, item: any) {

        return item.id;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

169. ¿Cómo se utiliza `ngIf` de Angular con `else` para representar elementos condicionalmente?

La directiva `ngIf` se puede usar con `else` para mostrar contenido alternativo según una condición.



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



@Component({

    selector: 'app-if-else',

    template: `

        <div *ngIf="isVisible; else notVisible">Visible Content</div>

        <ng-template #notVisible>Not Visible Content</ng-template>

    `

})

export class IfElseComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

170. ¿Cómo se utiliza `@HostBinding` de Angular para vincular propiedades al elemento host?

El decorador `@HostBinding` le permite vincular propiedades al elemento host de la directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('class.highlight') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

171. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos en el elemento host?

El decorador `@HostListener` le permite escuchar eventos en el elemento host de la directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Host element clicked!', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

172. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP?

El servicio `HttpClient` se utiliza para realizar solicitudes HTTP y manejar respuestas.



import { HttpClient } from '@angular/common/http';

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

import { Observable } from 'rxjs';



@Component({

    selector: 'app-http',

    template: `<p>Data: {{ data$ | async }}</p>`

})

export class HttpComponent {

    data$: Observable<any>;



    constructor(private http: HttpClient) {

        this.data$ = this.http.get('https://api.example.com/data');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

173. ¿Cómo se utiliza `HttpInterceptor` de Angular para modificar solicitudes y respuestas HTTP?

El `HttpInterceptor` le permite interceptar y modificar solicitudes y respuestas HTTP.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const clonedRequest = req.clone({

            setHeaders: { Authorization: 'Bearer token' }

        });

        return next.handle(clonedRequest);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

174. ¿Cómo se utiliza el `Router` de Angular para navegar entre rutas mediante programación?

El servicio `Router` se utiliza para navegar entre rutas mediante programación.



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

import { Router } from '@angular/router';



@Component({

    selector: 'app-navigate',

    template: `<button (click)="goToPage()">Go to Page</button>`

})

export class NavigateComponent {

    constructor(private router: Router) {}



    goToPage() {

        this.router.navigate(['/page']);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

175. ¿Cómo se utiliza `ActivatedRoute` de Angular para acceder a los parámetros de ruta?

El servicio `ActivatedRoute` le permite acceder a parámetros de ruta y parámetros de consulta.



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

import { ActivatedRoute } from '@angular/router';



@Component({

    selector: 'app-route',

    template: `<p>Param: {{ param }}</p>`

})

export class RouteComponent implements OnInit {

    param: string;



    constructor(private route: ActivatedRoute) {}



    ngOnInit() {

        this.route.params.subscribe(params => {

            this.param = params['id'];

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

176. ¿Cómo se utilizan los "Route Guards" de Angular para proteger rutas?

Los guardias de ruta se utilizan para proteger rutas en función de determinadas condiciones.



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

import { CanActivate, Router } from '@angular/router';



@Injectable({ providedIn: 'root' })

export class AuthGuard implements CanActivate {

    constructor(private router: Router) {}



    canActivate(): boolean {

        const isAuthenticated = false; // Check authentication

        if (!isAuthenticated) {

            this.router.navigate(['/login']);

            return false;

        }

        return true;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

177. ¿Cómo se utiliza `RouterOutlet` de Angular para mostrar componentes enrutados?

La directiva `RouterOutlet` se utiliza para mostrar componentes enrutados según la ruta activa.



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

import { RouterModule, Routes } from '@angular/router';

import { AppComponent } from './app.component';

import { HomeComponent } from './home.component';



const routes: Routes = [

    { path: '', component: HomeComponent }

];



@NgModule({



    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}



@Component({

    selector: 'app-root',

    template: `<router-outlet></router-outlet>`

})

export class AppComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

178. ¿Cómo se utiliza la "Inyección de dependencia" de Angular para inyectar servicios en componentes?

La inyección de dependencia se utiliza para inyectar servicios en componentes u otros servicios.



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



@Injectable({

    providedIn: 'root'

})

export class MyService {}



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

import { MyService } from './my.service';



@Component({

    selector: 'app-example',

    template: `<p>Service injected</p>`

})

export class ExampleComponent {

    constructor(private myService: MyService) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

179. ¿Cómo se utilizan las `Custom Pipes` de Angular para transformar datos?

Las canalizaciones personalizadas se utilizan para transformar datos antes de mostrarlos en la plantilla.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}



@Component({

    selector: 'app-pipe',

    template: `<p>{{ 'Angular' | reverse }}</p>`

})

export class PipeComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

180. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular para optimizar la detección de cambios?

`ChangeDetectionStrategy` se utiliza para controlar cómo Angular busca cambios en un componente.



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



@Component({

    selector: 'app-detection',

    template: `<p>Change Detection Strategy</p>`,

    changeDetection: ChangeDetectionStrategy.OnPush

})

export class DetectionComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares intermedias - Parte 10

181. ¿Cómo se utiliza `@Inject` de Angular para inyectar dependencias?

El decorador `@Inject` se usa para especificar un proveedor para inyectar en un constructor cuando la dependencia no es directamente inyectable.



import { Injectable, Inject } from '@angular/core';

import { DOCUMENT } from '@angular/common';



@Injectable({

    providedIn: 'root'

})

export class DocumentService {

    constructor(@Inject(DOCUMENT) private document: Document) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

182. ¿Cómo se utiliza el decorador `@Component` de Angular para definir los metadatos del componente?

El decorador `@Component` se utiliza para definir metadatos para un componente, como su selector, plantilla y estilos.



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



@Component({

    selector: 'app-example',

    templateUrl: './example.component.html',

    styleUrls: ['./example.component.css']

})

export class ExampleComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

183. ¿Cómo se utiliza `@NgModule` de Angular para definir módulos?

El decorador `@NgModule` define un módulo Angular proporcionando metadatos, como declaraciones, importaciones y proveedores.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

184. ¿Cómo se utiliza `ReactiveFormsModule` de Angular para crear formularios reactivos?

`ReactiveFormsModule` proporciona capacidades de formulario reactivo en Angular, lo que le permite crear y administrar formularios mediante programación.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

        <form [formGroup]="form">

            <label for="name">Name:</label>

            <input id="name" formControlName="name">

            <button (click)="submit()">Submit</button>

        </form>

    `

})

export class ReactiveFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['']

        });

    }



    submit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

185. ¿Cómo se utiliza `FormsModule` de Angular para crear formularios basados en plantillas?

`FormsModule` proporciona soporte para formularios basados en plantillas en Angular, lo que le permite crear formularios de forma declarativa.



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



@Component({

    selector: 'app-template-form',

    template: `

        <form #form="ngForm" (ngSubmit)="submit(form)">

            <label for="name">Name:</label>

            <input id="name" name="name" ngModel>

            <button type="submit">Submit</button>

        </form>

    `

})

export class TemplateFormComponent {

    submit(form: any) {

        console.log(form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

186. ¿Cómo se utiliza `HttpClient` de Angular con interceptores para iniciar sesión?

Los interceptores se pueden utilizar con `HttpClient` para registrar solicitudes y respuestas HTTP.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class LoggingInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        console.log('Request made:', req);

        return next.handle(req);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

187. ¿Cómo se utiliza `@Output` de Angular para emitir eventos desde un componente secundario?

El decorador `@Output` permite que un componente secundario emita eventos a un componente principal.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="notify()">Notify</button>`

})

export class ChildComponent {

    @Output() notifyEvent = new EventEmitter<void>();



    notify() {

        this.notifyEvent.emit();

    }

}



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



@Component({

    selector: 'app-parent',

    template: `<app-child (notifyEvent)="onNotify()"></app-child>`

})

export class ParentComponent {

    onNotify() {

        console.log('Notification received!');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

188. ¿Cómo se utiliza `ng-template` de Angular para crear plantillas reutilizables?

La directiva `ng-template` le permite definir plantillas reutilizables que se pueden usar con directivas estructurales.



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



@Component({

    selector: 'app-template',

    template: `

        <ng-template #template let-name="name">

            </ng-template><ng-template #template let-name="name"><p>Hello, {{ name }}!</p>

        </ng-template>

        <ng-container *ngTemplateOutlet="template; context: { name: 'Angular' }"></ng-container>

    `

})

export class TemplateComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

189. ¿Cómo se utiliza el `ng-content` de Angular para proyectar contenido en un componente?

La directiva `ng-content` se utiliza para proyectar contenido de un componente principal a un componente secundario.



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



@Component({

    selector: 'app-child',

    template: `<ng-content></ng-content>`

})

export class ChildComponent {}



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



@Component({

    selector: 'app-parent',

    template: `<app-child></app-child><app-child><p>Projected Content</p></app-child>`

})

export class ParentComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

190. ¿Cómo se utiliza el "cargador dinámico de componentes" de Angular para cargar componentes dinámicamente?

`ComponentFactoryResolver` le permite crear componentes dinámicamente en tiempo de ejecución.



import { Component, ComponentFactoryResolver, ViewChild, ViewContainerRef } from '@angular/core';

import { DynamicComponent } from './dynamic.component';



@Component({

    selector: 'app-dynamic-loader',

    template: `<ng-template #container></ng-template>`

})

export class DynamicLoaderComponent {

    @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;



    constructor(private resolver: ComponentFactoryResolver) {}



    loadComponent() {

        const factory = this.resolver.resolveComponentFactory(DynamicComponent);

        this.container.createComponent(factory);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

191. ¿Cómo se utiliza `FormArray` de Angular para administrar controles de formulario dinámicos?

`FormArray` se utiliza para administrar una colección de controles de formulario, que se pueden agregar o eliminar dinámicamente.



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

import { FormBuilder, FormGroup, FormArray } from '@angular/forms';



@Component({

    selector: 'app-dynamic-form',

    template: `

        <form [formGroup]="form">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i">

                    <button (click)="removeItem(i)">Remove</button>

                </div>

            </div>

            <button (click)="addItem()">Add Item</button>

        </form>

    `

})

export class DynamicFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            items: this.fb.array([])

        });

    }



    get items() {

        return this.form.get('items') as FormArray;

    }



    addItem() {

        this.items.push(this.fb.control(''));

    }



    removeItem(index: number) {

        this.items.removeAt(index);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

192. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

El servicio `ChangeDetectorRef` se utiliza para activar manualmente la detección de cambios en Angular.



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



@Component({

    selector: 'app-manual-detection',

    template: `<p>Manual Change Detection</p>`

})

export class ManualDetectionComponent {

    constructor(private cdr: ChangeDetectorRef) {}



    detectChanges() {

        this.cdr.detectChanges();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

193. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos DOM?

El decorador `@HostListener` le permite escuchar eventos DOM en el elemento host de una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Element clicked!', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

194. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a componentes o elementos secundarios?

El decorador `@ViewChild` le permite acceder a componentes secundarios, directivas o elementos DOM desde el componente principal.



import { Component, ViewChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-parent',

    template: `<button (click)="clickChild()">Click Child</button><app-child #child></app-child>`

})

export class ParentComponent {

    @ViewChild('child') child: ElementRef;



    clickChild() {

        console.log(this.child);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

195. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado?

El decorador `@ContentChild` le permite acceder al contenido proyectado en un componente usando `ng-content`.



import { Component, ContentChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-content',

    template: `<ng-content></ng-content>`

})

export class ContentComponent {

    @ContentChild('projectedContent') content: ElementRef;



    ngAfterContentInit() {

        console.log(this.content.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

196. ¿Cómo se utiliza `NgZone` de Angular para gestionar la detección de cambios?

El servicio `NgZone` le permite ejecutar código dentro o fuera de la zona de Angular, lo que afecta la detección de cambios.



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



@Component({

    selector: 'app-zone',

    template: `<p>NgZone Example</p>`

})

export class ZoneComponent {

    constructor(private ngZone: NgZone) {}



    runOutsideAngular() {

        this.ngZone.runOutsideAngular(() => {

            console.log('Running outside Angular zone');

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

197. ¿Cómo se utiliza `ViewEncapsulation` de Angular para controlar los estilos de los componentes?

La enumeración `ViewEncapsulation` controla cómo se aplican los estilos a los componentes.



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



@Component({

    selector: 'app-encapsulation',

    template: `<p>View Encapsulation Example</p>`,

    styles: [`p { color: blue; }`],

    encapsulation: ViewEncapsulation.Emulated

})

export class EncapsulationComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

198. ¿Cómo se utiliza `NgModule` de Angular para configurar módulos con carga diferida?

Los módulos de carga diferida se configuran usando `NgModule` y el método `RouterModule.forRoot` con la propiedad `loadChildren`.



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

import { RouterModule, Routes } from '@angular/router';



const routes: Routes = [

    { path: 'lazy', loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

199. ¿Cómo se utiliza `ChangeDetectionStrategy.OnPush` de Angular para optimizar el rendimiento?

La estrategia `ChangeDetectionStrategy.OnPush` optimiza el rendimiento al verificar cambios solo cuando las propiedades de entrada cambian o ocurren eventos.



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



@Component({

    selector: 'app-performance',

    template: `<p>OnPush Change Detection</p>`,

    changeDetection: ChangeDetectionStrategy.OnPush

})

export class PerformanceComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

200. ¿Cómo se utiliza el `ng-container` de Angular para representar elementos condicionalmente sin agregar nodos DOM adicionales?

La directiva `ng-container` le permite renderizar elementos condicionalmente sin agregar nodos DOM adicionales.



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



@Component({

    selector: 'app-container',

    template: `

        <ng-container *ngIf="isVisible">

            </ng-container><ng-container *ngIf="isVisible"><p>Conditionally Rendered Content</p>

        </ng-container>

    `

})

export class ContainerComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares intermedias - Parte 11

201. ¿Cómo se utiliza el decorador `@Injectable` de Angular para crear servicios?

El decorador `@Injectable` marca una clase como un servicio que se puede inyectar en otras clases.



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



@Injectable({

    providedIn: 'root'

})

export class DataService {

    getData() {

        return ['Data 1', 'Data 2', 'Data 3'];

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

202. ¿Cómo se utiliza `ngIf` de Angular para representar elementos condicionalmente?

La directiva `ngIf` incluye condicionalmente una plantilla basada en el valor de una expresión.



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



@Component({

    selector: 'app-condition',

    template: `

        <div *ngIf="isVisible">This content is visible</div>

    `

})

export class ConditionComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

203. ¿Cómo se utiliza `ngFor` de Angular para iterar sobre una lista?

La directiva `ngFor` se utiliza para iterar sobre una lista de elementos y representarlos en la plantilla.



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



@Component({

    selector: 'app-list',

    template: `

        <ul>

            <li *ngFor="let item de items">{{ item }}</li>

        </ul>

    `

})

export class ListComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

204. ¿Cómo se utiliza `ngSwitch` de Angular para mostrar elementos condicionalmente?

La directiva `ngSwitch` le permite mostrar diferentes plantillas según un valor.



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



@Component({

    selector: 'app-switch',

    template: `

        <div [ngSwitch]="color">

            <div *ngSwitchCase="'red'">Red color</div>

            <div *ngSwitchCase="'blue'">Blue color</div>

            <div *ngSwitchDefault>Default color</div>

        </div>

    `

})

export class SwitchComponent {

    color = 'blue';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

205. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a elementos o componentes secundarios?

El decorador `@ViewChild` se utiliza para obtener una referencia a un componente o elemento secundario en la plantilla.



import { Component, ViewChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-view-child',

    template: `<p #paragraph>Child Paragraph</p>`

})

export class ViewChildComponent {

    @ViewChild('paragraph') paragraph: ElementRef;



    ngAfterViewInit() {

        console.log(this.paragraph.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

206. ¿Cómo se utiliza `ngStyle` de Angular para aplicar estilos dinámicos?

La directiva `ngStyle` le permite aplicar estilos dinámicos a un elemento basándose en una expresión.



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



@Component({

    selector: 'app-style',

    template: `

        <div [ngStyle]="{ 'color': color, 'font-size.px': fontSize }">

            Styled Text

        </div>

    `

})

export class StyleComponent {

    color = 'red';

    fontSize = 20;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

207. ¿Cómo se utiliza `ngClass` de Angular para aplicar clases CSS condicionalmente?

La directiva `ngClass` le permite aplicar condicionalmente una o más clases CSS a un elemento.



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



@Component({

    selector: 'app-class',

    template: `

        <div [ngClass]="{ 'active': isActive, 'disabled': isDisabled }">

            Conditional Classes

        </div>

    `

})

export class ClassComponent {

    isActive = true;

    isDisabled = false;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

208. ¿Cómo se utiliza `@Input` de Angular para pasar datos de los componentes padre a hijo?

El decorador `@Input` permite que un componente secundario reciba datos de su componente principal.



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



@Component({

    selector: 'app-child',

    template: `<p>Received: {{ data }}</p>`

})

export class ChildComponent {

    @Input() data: string;

}



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



@Component({

    selector: 'app-parent',

    template: `<app-child [data]="parentData"></app-child>`

})

export class ParentComponent {

    parentData = 'Data from parent';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

209. ¿Cómo se utiliza `@HostBinding` de Angular para vincular propiedades al elemento host?

El decorador `@HostBinding` le permite vincular propiedades al elemento host de una directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('style.backgroundColor') backgroundColor = 'yellow';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

210. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos en el elemento host?

El decorador `@HostListener` le permite escuchar eventos en el elemento host de una directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Element clicked:', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

211. ¿Cómo se utiliza el `Router` de Angular para navegar entre diferentes rutas?

El servicio `Router` se utiliza para navegar entre diferentes rutas en una aplicación Angular.



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

import { Router } from '@angular/router';



@Component({

    selector: 'app-navigation',

    template: `<button (click)="navigate()">Go to Details</button>`

})

export class NavigationComponent {

    constructor(private router: Router) {}



    navigate() {

        this.router.navigate(['/details']);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

212. ¿Cómo se utiliza `ActivatedRoute` de Angular para acceder a los parámetros de ruta?

El servicio `ActivatedRoute` se utiliza para acceder a los parámetros de ruta y otra información sobre la ruta actual.



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

import { ActivatedRoute } from '@angular/router';



@Component({

    selector: 'app-details',

    template: `<p>Item ID: {{ itemId }}</p>`

})

export class DetailsComponent implements OnInit {

    itemId: string;



    constructor(private route: ActivatedRoute) {}



    ngOnInit() {

        this.itemId = this.route.snapshot.paramMap.get('id');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

213. ¿Cómo se utiliza el `RouterModule` de Angular para configurar rutas?

El `RouterModule` se utiliza para configurar rutas de aplicaciones utilizando el método `RouterModule.forRoot`.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home/home.component';

import { AboutComponent } from './about/about.component';



const routes: Routes = [

    { path: '', component: HomeComponent },

    { path: 'about', component: AboutComponent }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

214. ¿Cómo se utiliza la protección `CanActivate` de Angular para proteger rutas?

La guardia `CanActivate` se utiliza para controlar el acceso a rutas según las condiciones.



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

import { CanActivate, Router } from '@angular/router';



@Injectable({

    providedIn: 'root'

})

export class AuthGuard implements CanActivate {

    constructor(private router: Router) {}



    canActivate(): boolean {

        const isAuthenticated = false; // Example condition

        if (!isAuthenticated) {

            this.router.navigate(['/login']);

            return false;

        }

        return true;

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

215. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP?

El servicio `HttpClient` se utiliza para realizar solicitudes HTTP y manejar respuestas.



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

import { HttpClient } from '@angular/common/http';



@Injectable({

    providedIn: 'root'

})

export class DataService {

    constructor(private http: HttpClient) {}



    getData() {

        return this.http.get('https://api.example.com/data');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

216. ¿Cómo se utiliza el `HttpInterceptor` de Angular para modificar solicitudes y respuestas HTTP?

La interfaz `HttpInterceptor` le permite interceptar y modificar solicitudes y respuestas HTTP.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const authReq = req.clone({ setHeaders: { Authorization: 'Bearer token' } });

        return next.handle(authReq);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

217. ¿Cómo se utiliza `FormBuilder` de Angular para crear formularios reactivos?

El servicio `FormBuilder` simplifica la creación de formularios reactivos.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

        <form [formGroup]="form">

            <input formControlName="name">

            <input formControlName="email">

        </form>

    `

})

export class ReactiveFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: [''],

            email: ['']

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

218. ¿Cómo se utiliza `FormArray` de Angular para administrar una serie de controles de formulario?

`FormArray` le permite administrar una colección de controles de formulario.



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

import { FormBuilder, FormGroup, FormArray } from '@angular/forms';



@Component({

    selector: 'app-dynamic-form',

    template: `

        <form [formGroup]="form">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i">

                    <button (click)="removeItem(i)">Remove</button>

                </div>

            </div>

            <button (click)="addItem()">Add Item</button>

        </form>

    `

})

export class DynamicFormComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            items: this.fb.array([])

        });

    }



    get items() {

        return this.form.get('items') as FormArray;

    }



    addItem() {

        this.items.push(this.fb.control(''));

    }



    removeItem(index: number) {

        this.items.removeAt(index);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

219. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnChanges` de Angular para responder a los cambios de entrada?

El gancho del ciclo de vida `ngOnChanges` responde a cambios en las propiedades de entrada.



import { Component, OnChanges, SimpleChanges, Input } from '@angular/core';



@Component({

    selector: 'app-changes',

    template: `<p>Previous: {{ prevValue }}, Current: {{ currentValue }}</p>`

})

export class ChangesComponent implements OnChanges {

    @Input() value: string;

    prevValue: string;

    currentValue: string;



    ngOnChanges(changes: SimpleChanges) {

        if (changes.value) {

            this.prevValue = changes.value.previousValue;

            this.currentValue = changes.value.currentValue;

        }

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

220. ¿Cómo se utiliza el gancho del ciclo de vida `ngAfterViewInit` de Angular para realizar acciones después de que se haya inicializado la vista?

El gancho del ciclo de vida `ngAfterViewInit` se utiliza para realizar acciones después de que se hayan inicializado la vista y las vistas secundarias.



import { Component, AfterViewInit, ViewChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-after-view',

    template: `<p #paragraph>View Initialized</p>`

})

export class AfterViewComponent implements AfterViewInit {

    @ViewChild('paragraph') paragraph: ElementRef;



    ngAfterViewInit() {

        console.log(this.paragraph.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares intermedias - Parte 12

221. ¿Cómo se utiliza el `ng-content` de Angular para proyectar contenido en un componente?

La directiva `ng-content` le permite proyectar contenido en la vista de un componente.



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



@Component({

    selector: 'app-card',

    template: `

        <div class="card">

            <ng-content></ng-content>

        </div>

    `

})

export class CardComponent {}

            


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



@Component({

    selector: 'app-root',

    template: `

        <app-card>

            </app-card><app-card><h1>Card Title</h1>

            <p>Card content goes here.</p>

        </app-card>

    `

})

export class AppComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

222. ¿Cómo se utiliza `ng-template` de Angular para definir plantillas reutilizables?

La directiva `ng-template` define plantillas reutilizables de las que se pueden crear instancias más adelante.



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



@Component({

    selector: 'app-template',

    template: `

        <ng-template #myTemplate>

            </ng-template><ng-template #myTemplate><p>This is a reusable template.</p>

        </ng-template>

        <ng-container *ngTemplateOutlet="myTemplate"></ng-container>

    `

})

export class TemplateComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

223. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular para optimizar la detección de cambios?

`ChangeDetectionStrategy` se puede configurar en `OnPush` para optimizar el rendimiento de la detección de cambios.



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



@Component({

    selector: 'app-optimized',

    template: `<p>Optimized Change Detection</p>`,

    changeDetection: ChangeDetectionStrategy.OnPush

})

export class OptimizedComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

224. ¿Cómo se utiliza `Renderer2` de Angular para manipular elementos DOM de forma segura?

El servicio `Renderer2` se utiliza para manipular de forma segura elementos DOM sin acceso directo.



import { Component, ElementRef, Renderer2 } from '@angular/core';



@Component({

    selector: 'app-renderer',

    template: `<p #paragraph>Text</p>`

})

export class RendererComponent {

    constructor(private renderer: Renderer2, private el: ElementRef) {}



    ngAfterViewInit() {

        const paragraph = this.el.nativeElement.querySelector('p');

        this.renderer.setStyle(paragraph, 'color', 'blue');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

225. ¿Cómo se utiliza `@Directive` de Angular para crear directivas personalizadas?

El decorador `@Directive` se utiliza para crear directivas personalizadas que pueden modificar el comportamiento de los elementos.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) {}



    @HostListener('mouseenter') onMouseEnter() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.renderer.removeStyle(this.el.nativeElement, 'backgroundColor');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

226. ¿Cómo se utiliza `@NgModule` de Angular para definir módulos y sus dependencias?

El decorador `@NgModule` define un módulo y sus componentes, directivas y servicios.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { FeatureComponent } from './feature/feature.component';



@NgModule({

    declarations: [

        AppComponent,

        FeatureComponent

    ],

    imports: [

        BrowserModule

    ],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

227. ¿Cómo se utiliza la "inyección de dependencia" de Angular para proporcionar servicios?

La inyección de dependencia le permite proporcionar e inyectar servicios en componentes u otros servicios.



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



@Injectable({

    providedIn: 'root'

})

export class AuthService {

    login() {

        console.log('User logged in');

    }

}



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

import { AuthService } from './auth.service';



@Component({

    selector: 'app-login',

    template: `<button (click)="login()">Login</button>`

})

export class LoginComponent {

    constructor(private authService: AuthService) {}



    login() {

        this.authService.login();

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

228. ¿Cómo se utiliza el `Observable` de Angular para manejar flujos de datos asincrónicos?

La clase `Observable` se usa para manejar flujos de datos asincrónicos y a menudo se usa con `HttpClient` de Angular.



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

import { HttpClient } from '@angular/common/http';

import { Observable } from 'rxjs';



@Component({

    selector: 'app-data',

    template: `<p>{{ data | json }}</p>`

})

export class DataComponent implements OnInit {

    data: any;



    constructor(private http: HttpClient) {}



    ngOnInit() {

        this.getData().subscribe(response => this.data = response);

    }



    getData(): Observable<any> {

        return this.http.get('https://api.example.com/data');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

229. ¿Cómo se utilizan los operadores `RxJS` de Angular para transformar flujos de datos?

Los operadores RxJS se utilizan para transformar y manipular flujos de datos.



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

import { HttpClient } from '@angular/common/http';

import { map } from 'rxjs/operators';



@Component({

    selector: 'app-transformed-data',

    template: `<p>{{ data | json }}</p>`

})

export class TransformedDataComponent implements OnInit {

    data: any;



    constructor(private http: HttpClient) {}



    ngOnInit() {

        this.getData().pipe(

            map(response => response.items)

        ).subscribe(items => this.data = items);

    }



    getData() {

        return this.http.get<any>('https://api.example.com/data');

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

230. ¿Cómo se utilizan `@Output` y `EventEmitter` de Angular para emitir eventos desde un componente secundario?

El decorador `@Output` y `EventEmitter` se utilizan para emitir eventos desde un componente secundario a su componente principal.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="notify()">Notify</button>`

})

export class ChildComponent {

    @Output() notifyEvent = new EventEmitter<string>();



    notify() {

        this.notifyEvent.emit('Event from child');

    }

}



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



@Component({

    selector: 'app-parent',

    template: `<app-child (notifyEvent)="handleNotification($event)"></app-child>`

})

export class ParentComponent {

    handleNotification(message: string) {

        console.log(message);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

231. ¿Cómo se utiliza `@HostBinding` de Angular para vincular las propiedades del elemento host?

El decorador `@HostBinding` le permite vincular propiedades del elemento host.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('style.backgroundColor') backgroundColor: string = 'yellow';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

232. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos en el elemento host?

El decorador `@HostListener` escucha eventos en el elemento host.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

    @HostListener('click', ['$event'])

    onClick(event: MouseEvent) {

        console.log('Element clicked:', event);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

233. ¿Cómo se utiliza `ngFor` de Angular para recorrer una colección de elementos?

La directiva `ngFor` se utiliza para recorrer una colección y representar cada elemento.



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



@Component({

    selector: 'app-list',

    template: `

        <ul>

            <li *ngFor="let item de items">{{ item }}</li>

        </ul>

    `

})

export class ListComponent {

    items: string[] = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

234. ¿Cómo se utiliza `ngIf` de Angular para incluir o excluir elementos condicionalmente?

La directiva `ngIf` se utiliza para incluir o excluir condicionalmente elementos basados en una expresión.



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



@Component({

    selector: 'app-conditional',

    template: `

        <p *ngIf="isVisible">This text is visible</p>

    `

})

export class ConditionalComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

235. ¿Cómo se utiliza `ngSwitch` de Angular para mostrar elementos condicionalmente?

La directiva `ngSwitch` le permite mostrar elementos condicionalmente según un valor de cambio.



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



@Component({

    selector: 'app-switch',

    template: `

        <div [ngSwitch]="color">

            <p *ngSwitchCase="'red'">Red color</p>

            <p *ngSwitchCase="'green'">Green color</p>

            <p *ngSwitchDefault>Default color</p>

        </div>

    `

})

export class SwitchComponent {

    color = 'green';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

236. ¿Cómo se utiliza `ngStyle` de Angular para establecer estilos dinámicamente?

La directiva `ngStyle` le permite configurar dinámicamente estilos CSS basados en un objeto.



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



@Component({

    selector: 'app-style',

    template: `

        <div [ngStyle]="styles">Styled Div</div>

    `

})

export class StyleComponent {

    styles = {

        'color': 'blue',

        'font-size': '20px'

    };

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

237. ¿Cómo se utiliza `ngClass` de Angular para aplicar clases CSS condicionalmente?

La directiva `ngClass` le permite aplicar condicionalmente clases CSS basadas en una expresión.



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



@Component({

    selector: 'app-class',

    template: `

        <div [ngClass]="{'active': isActive, 'inactive': !isActive}">Styled Div</div>

    `

})

export class ClassComponent {

    isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

238. ¿Cómo se utiliza `ngModel` de Angular para vincular entradas de formulario a propiedades de componentes?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional entre las entradas del formulario y las propiedades del componente.



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



@Component({

    selector: 'app-two-way-binding',

    template: `

        <input [(ngModel)]="name">

        <p>Hello, {{ name }}!</p>

    `

})

export class TwoWayBindingComponent {

    name: string = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

239. ¿Cómo se utiliza `FormControl` de Angular para administrar controles de formulario individuales?

La clase `FormControl` se utiliza para gestionar el estado y la validación de controles de formulario individuales.



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

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



@Component({

    selector: 'app-form-control',

    template: `

        <input [formControl]="nameControl">

        <p>Control Value: {{ nameControl.value }}</p>

    `

})

export class FormControlComponent {

    nameControl = new FormControl('');

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

240. ¿Cómo se utiliza `FormGroup` de Angular para administrar un grupo de controles de formulario?

La clase `FormGroup` se utiliza para agrupar instancias relacionadas de `FormControl` en una sola entidad.



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

import { FormGroup, FormControl } from '@angular/forms';



@Component({

    selector: 'app-form-group',

    template: `

        <form [formGroup]="form">

            <input formControlName="name">

            <input formControlName="email">

        </form>

    `

})

export class FormGroupComponent {

    form = new FormGroup({

        name: new FormControl(''),

        email: new FormControl('')

    });

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares intermedias - Parte 13

241. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a componentes secundarios o elementos DOM?

El decorador `@ViewChild` le permite acceder a componentes secundarios o elementos DOM desde el componente principal.



import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<p #childParagraph>Child Component</p>`

})

export class ChildComponent {}



@Component({

    selector: 'app-parent',

    template: `

        <app-child></app-child>

        <button (click)="logChildParagraph()">Log Child Paragraph</button>

    `

})

export class ParentComponent implements AfterViewInit {

    @ViewChild(ChildComponent) child!: ChildComponent;

    @ViewChild('childParagraph') childParagraph!: ElementRef;



    ngAfterViewInit() {

        console.log(this.child);

        console.log(this.childParagraph.nativeElement.textContent);

    }



    logChildParagraph() {

        console.log(this.childParagraph.nativeElement.textContent);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

242. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado?

El decorador `@ContentChild` le permite acceder al contenido proyectado en el componente usando `ng-content`.



import { Component, ContentChild, AfterContentInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-card',

    template: `

        <ng-content></ng-content>

    `

})

export class CardComponent implements AfterContentInit {

    @ContentChild('cardContent') cardContent!: ElementRef;



    ngAfterContentInit() {

        console.log(this.cardContent.nativeElement.textContent);

    }

}



@Component({

    selector: 'app-root',

    template: `

        <app-card>

            </app-card><app-card><p #cardContent>Card Content</p>

        </app-card>

    `

})

export class AppComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

243. ¿Cómo se utiliza `@Input` de Angular para pasar datos de un componente principal a un componente secundario?

El decorador `@Input` permite que un componente principal pase datos a un componente secundario.



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



@Component({

    selector: 'app-child',

    template: `<p>Received: {{ data }}</p>`

})

export class ChildComponent {

    @Input() data!: string;

}



@Component({

    selector: 'app-parent',

    template: `<app-child [data]="parentData"></app-child>`

})

export class ParentComponent {

    parentData = 'Data from Parent';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

244. ¿Cómo se utiliza `@Output` de Angular para emitir eventos personalizados desde un componente secundario?

El decorador `@Output` se utiliza para crear eventos personalizados que un componente secundario puede emitir a su padre.



import { Component, EventEmitter, Output } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `<button (click)="sendMessage()">Send Message</button>`

})

export class ChildComponent {

    @Output() message = new EventEmitter<string>();



    sendMessage() {

        this.message.emit('Hello from Child');

    }

}



@Component({

    selector: 'app-parent',

    template: `<app-child (message)="receiveMessage($event)"></app-child>`

})

export class ParentComponent {

    receiveMessage(message: string) {

        console.log(message);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

245. ¿Cómo se utilizan `ReactiveForms` de Angular para crear un formulario con validación?

El módulo `ReactiveForms` proporciona una manera de crear formularios con validación usando `FormGroup` y `FormControl`.



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

import { FormGroup, FormControl, Validators } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

        <form [formGroup]="form" (ngSubmit)="onSubmit()">

            <label for="label">Name:</label>

            <input id="label" formControlName="name">

            <div *ngIf="form.get('name')?.invalid && form.get('name')?.touched">

                Name is required.

            </div>

            <button type="submit">Submit</button>

        </form>

    `

})

export class ReactiveFormComponent {

    form = new FormGroup({

        name: new FormControl('', Validators.required)

    });



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

246. ¿Cómo se utiliza `ngFor` de Angular para mostrar una lista de elementos con una plantilla personalizada?

La directiva `ngFor` se puede utilizar con una plantilla personalizada para mostrar una lista de elementos.



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



@Component({

    selector: 'app-item-list',

    template: `

        <ul>

            <ng-container *ngFor="let item de items; let i = index">

                </ng-container><ng-container *ngFor="let item de items; let i = index"><li>{{ i + 1 }}. {{ item }}</li>

            </ng-container>

        </ul>

    `

})

export class ItemListComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

247. ¿Cómo se utiliza `ngIf` de Angular con `else` para mostrar contenido condicionalmente?

La directiva `ngIf` se puede usar con la cláusula `else` para mostrar condicionalmente contenido alternativo.



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



@Component({

    selector: 'app-conditional',

    template: `

        <div *ngIf="isVisible; else elseBlock">

            <p>Content is visible</p>

        </div>

        <ng-template #elseBlock>

            </ng-template><ng-template #elseBlock><p>Content is hidden</p>

        </ng-template>

    `

})

export class ConditionalComponent {

    isVisible = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

248. ¿Cómo se utiliza `ngSwitch` de Angular con múltiples casos?

La directiva `ngSwitch` se puede usar con múltiples directivas `ngSwitchCase` para manejar diferentes casos.



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



@Component({

    selector: 'app-switch',

    template: `

        <div [ngSwitch]="color">

            <p *ngSwitchCase="'red'">Red</p>

            <p *ngSwitchCase="'green'">Green</p>

            <p *ngSwitchCase="'blue'">Blue</p>

            <p *ngSwitchDefault>Unknown color</p>

        </div>

    `

})

export class SwitchComponent {

    color = 'green';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

249. ¿Cómo se utiliza `ngStyle` de Angular para aplicar estilos condicionalmente?

La directiva `ngStyle` le permite aplicar estilos condicionalmente basados en un objeto.



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



@Component({

    selector: 'app-style',

    template: `

        <div [ngStyle]="{ 'background-color': isActive ? 'yellow' : 'white' }">

            Conditional Style

        </div>

    `

})

export class StyleComponent {

    isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

250. ¿Cómo se utiliza `ngClass` de Angular para alternar entre varias clases?

La directiva `ngClass` le permite alternar múltiples clases CSS basadas en un objeto o matriz.



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



@Component({

    selector: 'app-class',

    template: `

        <div [ngClass]="{ 'active': isActive, 'highlight': isHighlighted }">Styled Div</div>

    `

})

export class ClassComponent {

    isActive = true;

    isHighlighted = false;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

251. ¿Cómo se utiliza `ngModel` de Angular con formularios para administrar la entrada del usuario?

La directiva `ngModel` se utiliza para el enlace de datos bidireccional en formularios.



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



@Component({

    selector: 'app-form',

    template: `

        <form>

            <label for="label">Name:</label>

            <input id="label" [(ngModel)]="name" name="name2">

            <p>Your name is {{ name }}</p>

        </form>

    `

})

export class FormComponent {

    name = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

252. ¿Cómo se utiliza `FormBuilder` de Angular para crear formularios reactivos?

El servicio `FormBuilder` ayuda a crear instancias `FormGroup` y `FormControl` más fácilmente.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-form-builder',

    template: `

        <form [formGroup]="form" (ngSubmit)="onSubmit()">

            <label for="email">Email:</label>

            <input id="email" formControlName="email">

            <div *ngIf="form.get('email')?.invalid && form.get('email')?.touched">

                Email is required.

            </div>

            <button type="submit">Submit</button>

        </form>

    `

})

export class FormBuilderComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            email: ['', Validators.required]

        });

    }



    onSubmit() {

        console.log(this.form.value);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

253. ¿Cómo se utiliza `FormArray` de Angular para manejar campos de formulario dinámicos?

La clase `FormArray` se utiliza para manejar una matriz de controles o grupos de formulario.



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

import { FormBuilder, FormArray, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-form-array',

    template: `

        <form [formGroup]="form">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i">

                </div>

            </div>

            <button (click)="addItem()">Add Item</button>

        </form>

    `

})

export class FormArrayComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            items: this.fb.array([''])

        });

    }



    get items() {

        return this.form.get('items') as FormArray;

    }



    addItem() {

        this.items.push(this.fb.control(''));

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

254. ¿Cómo se utiliza `AsyncPipe` de Angular para manejar datos asincrónicos?

`AsyncPipe` se suscribe a un observable o promesa y devuelve el último valor.



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

import { Observable, de } from 'rxjs';



@Component({

    selector: 'app-async',

    template: `

        <div *ngIf="data$ | async as data">

            {{ data }}

        </div>

    `

})

export class AsyncComponent {

    data$: Observable<string> = of('Asynchronous Data');

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

255. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular para optimizar la detección de cambios?

`ChangeDetectionStrategy` se puede configurar en `OnPush` para optimizar la detección de cambios comprobando solo cuando cambian las propiedades de entrada.



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



@Component({

    selector: 'app-on-push',

    template: `<p>OnPush Change Detection</p>`,

    changeDetection: ChangeDetectionStrategy.OnPush

})

export class OnPushComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

256. ¿Cómo se utiliza `@Injectable` de Angular para proporcionar servicios en diferentes ámbitos?

El decorador `@Injectable` se utiliza para marcar una clase como disponible para ser inyectada. Los servicios se pueden proporcionar en diferentes niveles, como en la raíz o en un módulo específico.



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



@Injectable({

    providedIn: 'root' // or provide in a specific module

})

export class DataService {

    constructor() { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

257. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP?

El servicio `HttpClient` se utiliza para realizar solicitudes HTTP y manejar respuestas.



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

import { HttpClient } from '@angular/common/http';



@Component({

    selector: 'app-http',

    template: `

        <button (click)="fetchData()">Fetch Data</button>

        <pre>{{ data | json }}
` }) export class HttpComponent { data: any; constructor(private http: HttpClient) { } fetchData() { this.http.get('https://api.example.com/data').subscribe(response => { this.data = response; }); } }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

258. ¿Cómo se utiliza el `Router` de Angular para navegar entre rutas?

El servicio `Router` se utiliza para navegar entre rutas mediante programación.



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

import { Router } from '@angular/router';



@Component({

    selector: 'app-navigation',

    template: `<button (click)="goToHome()">Go to Home</button>`

})

export class NavigationComponent {

    constructor(private router: Router) { }



    goToHome() {

        this.router.navigate(['/home']);

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

259. ¿Cómo se utiliza `ActivatedRoute` de Angular para acceder a los parámetros de ruta?

El servicio `ActivatedRoute` se utiliza para acceder a los parámetros de ruta y consultar los parámetros.



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

import { ActivatedRoute } from '@angular/router';



@Component({

    selector: 'app-route-params',

    template: `<p>Route Parameter: {{ id }}</p>`

})

export class RouteParamsComponent implements OnInit {

    id!: string;



    constructor(private route: ActivatedRoute) { }



    ngOnInit() {

        this.route.paramMap.subscribe(params => {

            this.id = params.get('id')!;

        });

    }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

260. ¿Cómo se utiliza el `RouterModule` de Angular para definir y configurar rutas?

El `RouterModule` se utiliza para definir y configurar rutas en una aplicación Angular.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';

import { AboutComponent } from './about.component';



const routes: Routes = [

    { path: '', component: HomeComponent },

    { path: 'about', component: AboutComponent }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares de nivel intermedio - Parte 15

261. ¿Cómo se crea una tubería angular y se usa?

Se utiliza una tubería angular para transformar datos en plantillas. Creas una tubería usando el decorador `@Pipe`.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

262. ¿Cómo se crea un validador Angular personalizado?

Se pueden crear validadores personalizados implementando la interfaz `Validator` o creando una función que devuelva una función de validación.



import { AbstractControl, ValidatorFn } from '@angular/forms';



export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {

    return (control: AbstractControl): {[key: string]: any} | null => {

        const forbidden = nameRe.test(control.value);

        return forbidden ? { 'forbiddenName': { value: control.value } } : null;

    };

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

263. ¿Cómo se utilizan los decoradores `@HostBinding` y `@HostListener` de Angular?

`@HostBinding` vincula una propiedad del elemento host, mientras que `@HostListener` escucha eventos en el elemento host.



import { Directive, HostBinding, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    @HostBinding('style.backgroundColor') backgroundColor = 'transparent';



    @HostListener('mouseenter') onMouseEnter() {

        this.backgroundColor = 'yellow';

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.backgroundColor = 'transparent';

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

264. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

`ChangeDetectorRef` se utiliza para activar manualmente la detección de cambios o desconectar el detector de cambios.



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



@Component({

    selector: 'app-manual-change-detection',

    template: `

        <p>{{ data }}</p>

        <button (click)="updateData()">Update Data</button>

    `

})

export class ManualChangeDetectionComponent {

    data = 'Initial Data';



    constructor(private cdr: ChangeDetectorRef) {}



    updateData() {

        this.data = 'Updated Data';

        this.cdr.detectChanges(); // Manually trigger change detection

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

265. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnDestroy` de Angular?

El gancho del ciclo de vida `ngOnDestroy` se utiliza para limpiar recursos antes de que se destruya el componente.



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



@Component({

    selector: 'app-cleanup',

    template: `<p>Cleanup Component</p>`

})

export class CleanupComponent implements OnDestroy {

    ngOnDestroy() {

        console.log('CleanupComponent destroyed');

        // Perform cleanup here

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

266. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a componentes o elementos secundarios?

`@ViewChild` le permite acceder a un componente secundario o elemento DOM en la clase del componente principal.



import { Component, ViewChild, ElementRef } from '@angular/core';



@Component({

    selector: 'app-parent',

    template: `<app-child #child></app-child>`

})

export class ParentComponent {

    @ViewChild('child') childComponent!: ElementRef;



    ngAfterViewInit() {

        console.log(this.childComponent.nativeElement);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

267. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado?

`@ContentChild` le permite acceder al contenido proyectado dentro de un componente.



import { Component, ContentChild, AfterContentInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-content',

    template: `<ng-content></ng-content>`

})

export class ContentComponent implements AfterContentInit {

    @ContentChild('content') content!: ElementRef;



    ngAfterContentInit() {

        console.log(this.content.nativeElement.textContent);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

268. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnChanges` de Angular?

El gancho del ciclo de vida `ngOnChanges` se utiliza para detectar cambios en las propiedades de entrada.



import { Component, OnChanges, SimpleChanges, Input } from '@angular/core';



@Component({

    selector: 'app-changes',

    template: `<p>Changes Component</p>`

})

export class ChangesComponent implements OnChanges {

    @Input() data!: string;



    ngOnChanges(changes: SimpleChanges) {

        console.log('Changes detected:', changes);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

269. ¿Cómo se utiliza `ngSwitch` de Angular para mostrar contenido condicionalmente?

La directiva `ngSwitch` se utiliza para mostrar contenido condicionalmente basado en una expresión de cambio.



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



@Component({

    selector: 'app-switch',

    template: `

        <div [ngSwitch]="condition">

            <p *ngSwitchCase="'A'">Case A</p>

            <p *ngSwitchCase="'B'">Case B</p>

            <p *ngSwitchDefault>Default Case</p>

        </div>

    `

})

export class SwitchComponent {

    condition = 'A';

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

270. ¿Cómo se utiliza `ngClass` de Angular para aplicar múltiples clases CSS dinámicamente?

La directiva `ngClass` le permite aplicar múltiples clases CSS dinámicamente en función de los datos del componente.



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



@Component({

    selector: 'app-class',

    template: `

        <div [ngClass]="{ 'active': isActive, 'highlight': isHighlighted }">

            Conditional Classes

        </div>

    `

})

export class ClassComponent {

    isActive = true;

    isHighlighted = false;

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

271. ¿Cómo se utiliza `ng-template` de Angular para crear plantillas reutilizables?

La directiva `ng-template` le permite definir plantillas reutilizables.



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



@Component({

    selector: 'app-template',

    template: `

        <ng-template #myTemplate>

            </ng-template><ng-template #myTemplate><p>This is a reusable template</p>

        </ng-template>



        <ng-container *ngTemplateOutlet="myTemplate"></ng-container>

    `

})

export class TemplateComponent {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

272. ¿Cómo se utiliza `ngFor` de Angular con `trackBy` para mejorar el rendimiento?

La función `trackBy` ayuda a Angular a rastrear elementos en una lista para un mejor rendimiento.



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



@Component({

    selector: 'app-for',

    template: `

        <ul>

            <li *ngFor="let item de items; trackBy: trackById">{{ item.name }}</li>

        </ul>

    `

})

export class ForComponent {

    items = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }];



    trackById(index: number, item: any): number {

        return item.id;

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

273. ¿Cómo se utiliza `ngModel` de Angular con enlace de datos bidireccional?

La directiva `ngModel` proporciona enlace de datos bidireccional para elementos de formulario.



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



@Component({

    selector: 'app-model',

    template: `

        <input [(ngModel)]="name" placeholder="Enter your name">

        <p>Hello, {{ name }}!</p>

    `

})

export class ModelComponent {

    name = '';

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

274. ¿Cómo se utiliza la tubería `async` de Angular en las plantillas?

La canalización `async` se suscribe a un Observable o Promise y devuelve el último valor.



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

import { Observable, de } from 'rxjs';



@Component({

    selector: 'app-async',

    template: `

        <div *ngIf="data$ | async as data">

            {{ data }}

        </div>

    `

})

export class AsyncComponent {

    data$: Observable<string> = of('Async Data');

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

275. ¿Cómo se utiliza `FormBuilder` de Angular para simplificar la creación de formularios?

El servicio `FormBuilder` simplifica la creación de formularios con formularios reactivos.



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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-form-builder',

    template: `

        <form [formGroup]="form">

            <input formControlName="name" placeholder="Name">

            <button (click)="submit()">Submit</button>

        </form>

    `

})

export class FormBuilderComponent {

    form: FormGroup;



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            name: ['']

        });

    }



    submit() {

        console.log(this.form.value);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

276. ¿Cómo se utiliza `HttpInterceptor` de Angular para modificar solicitudes y respuestas HTTP?

`HttpInterceptor` le permite interceptar y modificar solicitudes y respuestas HTTP.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const clonedReq = req.clone({ headers: req.headers.set('Authorization', 'Bearer token') });

        return next.handle(clonedReq);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

277. ¿Cómo se utiliza el `Router` de Angular para navegar mediante programación?

El servicio `Router` le permite navegar mediante programación dentro de su aplicación.



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

import { Router } from '@angular/router';



@Component({

    selector: 'app-navigate',

    template: `<button (click)="goToHome()">Go to Home</button>`

})

export class NavigateComponent {

    constructor(private router: Router) {}



    goToHome() {

        this.router.navigate(['/home']);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

278. ¿Cómo se utiliza el `ng-container` de Angular para agrupar elementos sin afectar el diseño?

`ng-container` es un contenedor lógico que no afecta el diseño del DOM.



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



@Component({

    selector: 'app-container',

    template: `

        <ng-container *ngIf="isVisible">

            </ng-container><ng-container *ngIf="isVisible"><p>Content is visible</p>

        </ng-container>

    `

})

export class ContainerComponent {

    isVisible = true;

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

279. ¿Cómo se utiliza el `RouterModule` de Angular para configurar el enrutamiento?

El `RouterModule` se utiliza para configurar y administrar el enrutamiento en aplicaciones Angular.



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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';

import { AboutComponent } from './about.component';



const routes: Routes = [

    { path: 'home', component: HomeComponent },

    { path: 'about', component: AboutComponent },

    { path: '', redirectTo: '/home', pathMatch: 'full' }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

280. ¿Cómo se utiliza `@Inject` de Angular para inyectar dependencias?

El decorador `@Inject` se utiliza para especificar una dependencia que se inyectará.



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



@Component({

    selector: 'app-inject',

    template: `<p>Inject Component</p>`

})

export class InjectComponent {

    constructor(@Inject('API_URL') private apiUrl: string) {

        console.log(apiUrl);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares de nivel intermedio - Parte 16

281. ¿Cómo se utiliza `FormArray` de Angular para administrar una serie de controles de formulario?

`FormArray` se utiliza para administrar una serie de controles de formulario en forma reactiva.



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

import { FormBuilder, FormArray, FormGroup } from '@angular/forms';



@Component({

    selector: 'app-form-array',

    template: `

        <form [formGroup]="form">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i" placeholder="Item {{ i + 1 }}">

                </div>

            </div>

            <button (click)="addItem()">Add Item</button>

        </form>

    `

})

export class FormArrayComponent {

    form: FormGroup;



    get items(): FormArray {

        return this.form.get('items') as FormArray;

    }



    constructor(private fb: FormBuilder) {

        this.form = this.fb.group({

            items: this.fb.array([])

        });

    }



    addItem() {

        this.items.push(this.fb.control(''));

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

282. ¿Cómo se utiliza el decorador `@Optional` de Angular para manejar dependencias opcionales?

El decorador `@Optional` le permite inyectar dependencias que pueden estar disponibles o no.



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



@Component({

    selector: 'app-optional',

    template: `<p>Optional Component</p>`

})

export class OptionalComponent {

    constructor(@Optional() private optionalService?: SomeService) {

        if (this.optionalService) {

            // Use the service

        } else {

            // Handle the absence de the service

        }

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

283. ¿Cómo se utiliza `NgZone` de Angular para ejecutar código dentro o fuera de la zona de Angular?

`NgZone` le permite ejecutar código dentro o fuera de la zona de detección de cambios de Angular.



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



@Component({

    selector: 'app-zone',

    template: `<p>Zone Component</p>`

})

export class ZoneComponent {

    constructor(private ngZone: NgZone) {

        this.ngZone.runOutsideAngular(() => {

            // Code running outside Angular's zone

            console.log('Outside Angular Zone');

            // Simulate an async operation

            setTimeout(() => {

                this.ngZone.run(() => {

                    console.log('Back inside Angular Zone');

                });

            }, 1000);

        });

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

284. ¿Cómo se utiliza el decorador `@Injectable` de Angular con provideIn?

El decorador `@Injectable` con `providedIn` le permite especificar el alcance del proveedor para un servicio.



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



@Injectable({

    providedIn: 'root' // Service is available throughout the app

})

export class MyService {

    constructor() {}

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

285. ¿Cómo se utiliza `@ContentChildren` de Angular para acceder a múltiples elementos de contenido proyectados?

`@ContentChildren` se utiliza para acceder a múltiples elementos de contenido proyectados.



import { Component, ContentChildren, QueryList, AfterContentInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-content',

    template: `

        <ng-content></ng-content>

    `

})

export class ContentComponent implements AfterContentInit {

    @ContentChildren('content') contents!: QueryList<ElementRef>;



    ngAfterContentInit() {

        this.contents.forEach(content => {

            console.log(content.nativeElement.textContent);

        });

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

286. ¿Cómo se utiliza el decorador `@Host` de Angular para inyectar una dependencia del elemento host?

El decorador `@Host` le permite inyectar una dependencia desde el elemento host.



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



@Component({

    selector: 'app-host',

    template: `<p>Host Component</p>`

})

export class HostComponent {

    constructor(@Host() private parentComponent: ParentComponent) {

        console.log(this.parentComponent);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

287. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular para pasar datos entre componentes?

`@Input` y `@Output` se utilizan para pasar datos entre componentes padre e hijo.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `

        <p>{{ data }}</p>

        <button (click)="sendData()">Send Data</button>

    `

})

export class ChildComponent {

    @Input() data!: string;

    @Output() dataChange = new EventEmitter<string>();



    sendData() {

        this.dataChange.emit('New Data');

    }

}



@Component({

    selector: 'app-parent',

    template: `

        <app-child [data]="parentData" (dataChange)="handleDataChange($event)"></app-child>

    `

})

export class ParentComponent {

    parentData = 'Initial Data';



    handleDataChange(newData: string) {

        this.parentData = newData;

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

288. ¿Cómo se utiliza el decorador `@Inject` de Angular para inyectar tokens?

El decorador `@Inject` se utiliza para inyectar tokens para la inyección de dependencia.



import { InjectionToken, Injectable, Inject } from '@angular/core';



export const API_URL = new InjectionToken<string>('apiUrl');



@Injectable({

    providedIn: 'root'

})

export class ApiService {

    constructor(@Inject(API_URL) private apiUrl: string) {

        console.log(apiUrl);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

289. ¿Cómo se utiliza `ngIf` de Angular con `else` para manejar plantillas condicionales?

`ngIf` con `else` le permite manejar plantillas condicionales de manera más elegante.



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



@Component({

    selector: 'app-if-else',

    template: `

        <ng-container *ngIf="isVisible; else elseBlock">

            </ng-container><ng-container *ngIf="isVisible; else elseBlock"><p>Visible</p>

        </ng-container>

        <ng-template #elseBlock>

            </ng-template><ng-template #elseBlock><p>Not Visible</p>

        </ng-template>

    `

})

export class IfElseComponent {

    isVisible = true;

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

290. ¿Cómo se utiliza `ngFor` de Angular con `index` para mostrar índices de elementos?

`ngFor` con `index` le permite mostrar el índice de elementos en una lista.



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



@Component({

    selector: 'app-for-index',

    template: `

        <ul>

            <li *ngFor="let item de items; let i = index">

                {{ i + 1 }}. {{ item }}

            </li>

        </ul>

    `

})

export class ForIndexComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

291. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a un componente o elemento secundario?

`@ViewChild` le permite acceder a un componente o elemento secundario en la plantilla.



import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

    selector: 'app-view-child',

    template: `

        <div #content>Content</div>

    `

})

export class ViewChildComponent implements AfterViewInit {

    @ViewChild('content') content!: ElementRef;



    ngAfterViewInit() {

        console.log(this.content.nativeElement.textContent);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

292. ¿Cómo se utiliza `ngClass` de Angular para aplicar clases CSS condicionalmente?

`ngClass` se usa para aplicar condicionalmente clases CSS basadas en expresiones.



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



@Component({

    selector: 'app-class',

    template: `

        <div [ngClass]="{ 'active': isActive, 'disabled': !isActive }">

            Conditional Classes

        </div>

    `

})

export class ClassComponent {

    isActive = true;

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

293. ¿Cómo se utiliza `ngStyle` de Angular para aplicar estilos en línea dinámicamente?

`ngStyle` le permite aplicar estilos en línea dinámicamente basados en expresiones.



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



@Component({

    selector: 'app-style',

    template: `

        <div [ngStyle]="{ 'color': color, 'font-size': fontSize + 'px' }">

            Dynamic Styles

        </div>

    `

})

export class StyleComponent {

    color = 'blue';

    fontSize = 16;

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

294. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos DOM?

El decorador `@HostListener` le permite escuchar eventos DOM en el elemento host.



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



@Component({

    selector: 'app-host-listener',

    template: `<p>Host Listener Component</p>`

})

export class HostListenerComponent {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Element clicked', event);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

295. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

`ChangeDetectorRef` le permite activar manualmente la detección de cambios en Angular.



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



@Component({

    selector: 'app-change-detector',

    template: `<p>Change Detector Component</p>`

})

export class ChangeDetectorComponent {

    constructor(private cdr: ChangeDetectorRef) {}



    triggerChangeDetection() {

        this.cdr.detectChanges();

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

296. ¿Cómo se utiliza `@Directive` de Angular para crear una directiva personalizada?

El decorador `@Directive` se utiliza para crear directivas personalizadas.



import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

    selector: '[appHighlight]'

})

export class HighlightDirective {

    constructor(private el: ElementRef, private renderer: Renderer2) {}



    @HostListener('mouseenter') onMouseEnter() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

    }



    @HostListener('mouseleave') onMouseLeave() {

        this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'transparent');

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

297. ¿Cómo se utiliza `@Pipe` de Angular para crear una tubería personalizada?

El decorador `@Pipe` se utiliza para crear tuberías personalizadas.



import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

    name: 'reverse'

})

export class ReversePipe implements PipeTransform {

    transform(value: string): string {

        return value.split('').reverse().join('');

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

298. ¿Cómo se utiliza `@NgModule` de Angular para definir los metadatos del módulo?

El decorador `@NgModule` se utiliza para definir los metadatos de un módulo Angular.



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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



@NgModule({

    declarations: [AppComponent],

    imports: [BrowserModule],

    providers: [],

    bootstrap: [AppComponent]

})

export class AppModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

299. ¿Cómo se utiliza el `Router` de Angular para definir rutas anidadas?

Las rutas anidadas se pueden definir utilizando rutas secundarias en la configuración del enrutador Angular.



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

import { RouterModule, Routes } from '@angular/router';

import { ParentComponent } from './parent.component';

import { ChildComponent } from './child.component';



const routes: Routes = [

    { path: 'parent', component: ParentComponent, children: [

        { path: 'child', component: ChildComponent }

    ]}

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

300. ¿Cómo se utiliza `@NgModule` de Angular para importar y exportar módulos?

El decorador `@NgModule` le permite importar y exportar módulos dentro de su aplicación.



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

import { CommonModule } from '@angular/common';

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



@NgModule({

    imports: [CommonModule, FormsModule],

    exports: [CommonModule, FormsModule]

})

export class SharedModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas angulares de nivel intermedio - Parte 17

301. ¿Cómo se utiliza la directiva `ngSwitch` de Angular para mostrar contenido condicionalmente?

`ngSwitch` le permite mostrar contenido condicionalmente basado en una expresión.



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



@Component({

    selector: 'app-switch',

    template: `

        <div [ngSwitch]="color">

            <p *ngSwitchCase="'red'">Red</p>

            <p *ngSwitchCase="'green'">Green</p>

            <p *ngSwitchDefault>Default</p>

        </div>

    `

})

export class SwitchComponent {

    color = 'green';

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

302. ¿Cómo se utiliza `ngIf` de Angular con `then` para manejar plantillas condicionales?

`ngIf` con `then` le permite especificar una plantilla para mostrar cuando la condición sea verdadera.



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



@Component({

    selector: 'app-if-then',

    template: `

        <ng-container *ngIf="isVisible; then thenBlock; else elseBlock"></ng-container>

        <ng-template #thenBlock>

            </ng-template><ng-template #thenBlock><p>Visible</p>

        </ng-template>

        <ng-template #elseBlock>

            </ng-template><ng-template #elseBlock><p>Not Visible</p>

        </ng-template>

    `

})

export class IfThenComponent {

    isVisible = true;

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

303. ¿Cómo se utiliza `ngFor` de Angular para iterar sobre objetos?

`ngFor` se puede utilizar para iterar sobre objetos y acceder a sus propiedades.



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



@Component({

    selector: 'app-for-object',

    template: `

        <ul>

            <li *ngFor="let key de objectKeys(myObject)">

                {{ key }}: {{ myObject[key] }}

            </li>

        </ul>

    `

})

export class ForObjectComponent {

    myObject = { name: 'Alice', age: 30, city: 'New York' };



    objectKeys(obj: any) {

        return Object.keys(obj);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

304. ¿Cómo se utiliza el decorador `@Injectable` de Angular para crear un servicio con un proveedor personalizado?

`@Injectable` se puede utilizar con proveedores personalizados para configurar la inyección de servicios.



import { Injectable, InjectionToken } from '@angular/core';



export const API_URL = new InjectionToken<string>('apiUrl');



@Injectable({

    providedIn: 'root'

})

export class ApiService {

    constructor(@Inject(API_URL) private apiUrl: string) {}

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

305. ¿Cómo se utiliza `@ViewChild` de Angular con opciones estáticas para acceder a componentes secundarios?

`@ViewChild` con `static: true` permite el acceso a los componentes secundarios antes de la inicialización de la vista.



import { Component, ViewChild, AfterViewInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-static-view-child',

    template: `

        <div #content>Static View Child Content</div>

    `

})

export class StaticViewChildComponent implements AfterViewInit {

    @ViewChild('content', { static: true }) content!: ElementRef;



    ngAfterViewInit() {

        console.log(this.content.nativeElement.textContent);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

306. ¿Cómo se utiliza `@Output` de Angular con `EventEmitter` para emitir eventos personalizados?

`@Output` con `EventEmitter` le permite emitir eventos personalizados desde un componente secundario.



import { Component, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-output',

    template: `

        <button (click)="notifyParent()">Notify Parent</button>

    `

})

export class OutputComponent {

    @Output() notify = new EventEmitter<string>();



    notifyParent() {

        this.notify.emit('Hello from child!');

    }

}



@Component({

    selector: 'app-parent',

    template: `

        <app-output (notify)="handleNotification($event)"></app-output>

        <p>{{ message }}</p>

    `

})

export class ParentComponent {

    message = '';



    handleNotification(msg: string) {

        this.message = msg;

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

307. ¿Cómo se utiliza `NgModule` de Angular con carga diferida para cargar módulos a pedido?

La carga diferida se implementa utilizando la propiedad `loadChildren` en la configuración de ruta.



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

import { RouterModule, Routes } from '@angular/router';



const routes: Routes = [

    { path: 'lazy', loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

308. ¿Cómo se utiliza `NgZone` de Angular para gestionar la detección de cambios manualmente?

`NgZone` le permite administrar la detección de cambios de Angular manualmente.



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



@Component({

    selector: 'app-zone',

    template: `<p>Zone Component</p>`

})

export class ZoneComponent {

    constructor(private ngZone: NgZone) {}



    runOutsideAngular() {

        this.ngZone.runOutsideAngular(() => {

            // Code running outside Angular's zone

            console.log('Running outside Angular zone');

            setTimeout(() => {

                this.ngZone.run(() => {

                    console.log('Running inside Angular zone');

                });

            }, 1000);

        });

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

309. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar la detección de cambios?

`ChangeDetectorRef` se utiliza para activar manualmente la detección de cambios.



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



@Component({

    selector: 'app-change-detector',

    template: `<p>Change Detector Component</p>`

})

export class ChangeDetectorComponent {

    constructor(private cdr: ChangeDetectorRef) {}



    triggerChangeDetection() {

        this.cdr.detectChanges();

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

310. ¿Cómo se utiliza `@HostBinding` de Angular para vincular propiedades al elemento host?

`@HostBinding` le permite vincular propiedades al elemento host de una directiva o componente.



import { Directive, HostBinding } from '@angular/core';



@Directive({

    selector: '[appHostBinding]'

})

export class HostBindingDirective {

    @HostBinding('class.active') isActive = true;

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

311. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos en el elemento host?

`@HostListener` se usa para escuchar eventos en el elemento host.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appHostListener]'

})

export class HostListenerDirective {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Host element clicked', event);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

312. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular juntos para pasar datos entre componentes?

`@Input` se usa para pasar datos a un componente secundario, mientras que `@Output` se usa para emitir eventos desde el componente secundario.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `

        <p>{{ data }}</p>

        <button (click)="notifyParent()">Notify Parent</button>

    `

})

export class ChildComponent {

    @Input() data!: string;

    @Output() notify = new EventEmitter<void>();



    notifyParent() {

        this.notify.emit();

    }

}



@Component({

    selector: 'app-parent',

    template: `

        <app-child [data]="parentData" (notify)="handleNotification()"></app-child>

        <p>{{ message }}</p>

    `

})

export class ParentComponent {

    parentData = 'Data from parent';

    message = '';



    handleNotification() {

        this.message = 'Child component notified!';

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

313. ¿Cómo se utiliza el `Router` de Angular para manejar los parámetros de ruta?

El `Router` le permite manejar los parámetros de ruta usando la configuración de ruta y el servicio de ruta activado.



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

import { ActivatedRoute } from '@angular/router';



@Component({

    selector: 'app-route-param',

    template: `<p>Route Param: {{ id }}</p>`

})

export class RouteParamComponent implements OnInit {

    id!: string;



    constructor(private route: ActivatedRoute) {}



    ngOnInit() {

        this.route.paramMap.subscribe(params => {

            this.id = params.get('id') || '';

        });

    }

}



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

import { RouterModule, Routes } from '@angular/router';

import { RouteParamComponent } from './route-param.component';



const routes: Routes = [

    { path: 'param/:id', component: RouteParamComponent }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

314. ¿Cómo se utiliza el `Router` de Angular para definir guardias de ruta?

Los guardias de ruta se utilizan para controlar el acceso a las rutas según las condiciones.



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

import { CanActivate, Router } from '@angular/router';



@Injectable({

    providedIn: 'root'

})

export class AuthGuard implements CanActivate {

    constructor(private router: Router) {}



    canActivate(): boolean {

        const isLoggedIn = false; // Replace with real authentication check

        if (!isLoggedIn) {

            this.router.navigate(['/login']);

            return false;

        }

        return true;

    }

}



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

import { RouterModule, Routes } from '@angular/router';

import { AuthGuard } from './auth.guard';

import { HomeComponent } from './home.component';

import { LoginComponent } from './login.component';



const routes: Routes = [

    { path: '', component: HomeComponent },

    { path: 'login', component: LoginComponent },

    { path: 'protected', component: ProtectedComponent, canActivate: [AuthGuard] }

];



@NgModule({

    imports: [RouterModule.forRoot(routes)],

    exports: [RouterModule]

})

export class AppRoutingModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

315. ¿Cómo se utiliza `NgModule` de Angular para definir las dependencias de los módulos?

Las dependencias de los módulos se definen utilizando la matriz `imports` en el decorador `@NgModule`.



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

import { CommonModule } from '@angular/common';

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



@NgModule({

    imports: [CommonModule, FormsModule],

    declarations: [SomeComponent],

    exports: [SomeComponent]

})

export class SomeModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

316. ¿Cómo se utiliza el decorador `@Component` de Angular para configurar los metadatos del componente?

El decorador `@Component` se utiliza para configurar metadatos como selector, plantilla y estilos.



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



@Component({

    selector: 'app-example',

    template: `<p>Example Component</p>`,

    styles: [`p { color: blue; }`]

})

export class ExampleComponent {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

317. ¿Cómo se utiliza `@NgModule` de Angular para crear un módulo de funciones?

Se crea un módulo de funciones utilizando `@NgModule` para agrupar componentes, directivas y servicios relacionados.



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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';



@NgModule({

    imports: [CommonModule],

    declarations: [FeatureComponent],

    exports: [FeatureComponent]

})

export class FeatureModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

318. ¿Cómo se utiliza `@Inject` de Angular para inyectar dependencias en un servicio?

`@Inject` se utiliza para especificar un proveedor personalizado para la inyección de dependencia.



import { Injectable, Inject } from '@angular/core';



export const API_URL = new InjectionToken<string>('apiUrl');



@Injectable({

    providedIn: 'root'

})

export class ApiService {

    constructor(@Inject(API_URL) private apiUrl: string) {}

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

319. ¿Cómo se utiliza `@NgModule` de Angular para definir importaciones y proveedores de módulos?

Las importaciones y proveedores de módulos se definen utilizando las matrices `imports` y `providers` en `@NgModule`.



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

import { CommonModule } from '@angular/common';

import { SomeService } from './some.service';



@NgModule({

    imports: [CommonModule],

    providers: [SomeService]

})

export class SharedModule {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

320. ¿Cómo se utiliza `@Component` de Angular para definir plantillas y estilos de componentes?

El decorador `@Component` define plantillas y estilos de componentes usando las propiedades `template` y `styles`.



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



@Component({

    selector: 'app-example',

    template: `<div>Hello World</div>`,

    styles: [`div { color: red; }`]

})

export class ExampleComponent {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas angulares de nivel intermedio - Parte 18

321. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP GET?

`HttpClient` se utiliza para realizar solicitudes HTTP GET y manejar respuestas.



import { HttpClient } from '@angular/common/http';

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



@Component({

    selector: 'app-http-get',

    template: `<p>Data: {{ data | json }}</p>`

})

export class HttpGetComponent implements OnInit {

    data: any;



    constructor(private http: HttpClient) {}



    ngOnInit() {

        this.http.get('https://api.example.com/data').subscribe(response => {

            this.data = response;

        });

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

322. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP POST?

`HttpClient` se utiliza para realizar solicitudes HTTP POST para enviar datos al servidor.



import { HttpClient } from '@angular/common/http';

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



@Component({

    selector: 'app-http-post',

    template: `<button (click)="sendData()">Send Data</button>`

})

export class HttpPostComponent {

    constructor(private http: HttpClient) {}



    sendData() {

        const payload = { key: 'value' };

        this.http.post('https://api.example.com/submit', payload).subscribe(response => {

            console.log('Response:', response);

        });

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

323. ¿Cómo se utiliza `HttpClient` de Angular para manejar los parámetros de consulta?

Los parámetros de consulta se pueden manejar usando la opción `params` en los métodos `HttpClient`.



import { HttpClient, HttpParams } from '@angular/common/http';

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



@Component({

    selector: 'app-http-params',

    template: `<p>Data: {{ data | json }}</p>`

})

export class HttpParamsComponent implements OnInit {

    data: any;



    constructor(private http: HttpClient) {}



    ngOnInit() {

        let params = new HttpParams().set('param1', 'value1');

        this.http.get('https://api.example.com/data', { params }).subscribe(response => {

            this.data = response;

        });

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

324. ¿Cómo se utiliza `HttpInterceptor` de Angular para agregar encabezados a solicitudes HTTP?

`HttpInterceptor` le permite modificar solicitudes y respuestas HTTP globalmente.



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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const authReq = req.clone({

            setHeaders: { Authorization: 'Bearer token' }

        });

        return next.handle(authReq);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

325. ¿Cómo se utiliza `HttpClient` de Angular para manejar errores HTTP?

Los errores en las solicitudes HTTP se pueden manejar utilizando operadores RxJS como `catchError`.



import { HttpClient } from '@angular/common/http';

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

import { catchError } from 'rxjs/operators';

import { de } from 'rxjs';



@Component({

    selector: 'app-http-error',

    template: `<p>Error: {{ errorMessage }}</p>`

})

export class HttpErrorComponent {

    errorMessage: string = '';



    constructor(private http: HttpClient) {}



    makeRequest() {

        this.http.get('https://api.example.com/data').pipe(

            catchError(error => {

                this.errorMessage = 'An error occurred!';

                return of([]);

            })

        ).subscribe();

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

326. ¿Cómo se utiliza `NgForm` de Angular para manejar la validación de formularios?

`NgForm` proporciona validación de formularios y gestión de estado.



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

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



@Component({

    selector: 'app-form-validation',

    template: `

        <form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">

            <input name="name3" ngModel required>

            <button type="submit" [disabled]="myForm.invalid">Submit</button>

        </form>

    `

})

export class FormValidationComponent {

    onSubmit(form: NgForm) {

        if (form.valid) {

            console.log('Form Submitted!', form.value);

        }

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

327. ¿Cómo se utiliza `FormBuilder` de Angular para crear formularios reactivos?

`FormBuilder` se utiliza para crear formularios reactivos con validadores.



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

    selector: 'app-reactive-form',

    template: `

        <form [formGroup]="myForm" (ngSubmit)="onSubmit()">

            <input formControlName="name">

            <button type="submit" [disabled]="myForm.invalid">Submit</button>

        </form>

    `

})

export class ReactiveFormComponent {

    myForm: FormGroup;



    constructor(private fb: FormBuilder) {

        this.myForm = this.fb.group({

            name: ['', Validators.required]

        });

    }



    onSubmit() {

        if (this.myForm.valid) {

            console.log('Form Submitted!', this.myForm.value);

        }

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

328. ¿Cómo se utiliza `FormControl` de Angular para manejar campos de formulario?

`FormControl` se utiliza para gestionar el valor y la validación de campos de formulario individuales.



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

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



@Component({

    selector: 'app-form-control',

    template: `

        <input [formControl]="nameControl">

        <p *ngIf="nameControl.invalid && (nameControl.dirty || nameControl.touched)">

            Name is required

        </p>

    `

})

export class FormControlComponent {

    nameControl = new FormControl('', Validators.required);

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

329. ¿Cómo se utiliza `FormArray` de Angular para manejar campos de formulario dinámicos?

`FormArray` le permite administrar una serie de controles de formulario o grupos de forma dinámica.



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

import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms';



@Component({

    selector: 'app-form-array',

    template: `

        <form [formGroup]="myForm" (ngSubmit)="onSubmit()">

            <div formArrayName="items">

                <div *ngFor="let item de items.controls; let i = index">

                    <input [formControlName]="i">

                </div>

            </div>

            <button type="button" (click)="addItem()">Add Item</button>

            <button type="submit" [disabled]="myForm.invalid">Submit</button>

        </form>

    `

})

export class FormArrayComponent {

    myForm: FormGroup;



    get items() {

        return this.myForm.get('items') as FormArray;

    }



    constructor(private fb: FormBuilder) {

        this.myForm = this.fb.group({

            items: this.fb.array([this.fb.control('', Validators.required)])

        });

    }



    addItem() {

        this.items.push(this.fb.control('', Validators.required));

    }



    onSubmit() {

        if (this.myForm.valid) {

            console.log('Form Submitted!', this.myForm.value);

        }

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

330. ¿Cómo se utiliza la directiva `ngFor` de Angular para iterar sobre una lista de elementos?

`ngFor` se usa para iterar sobre una lista y representar una plantilla para cada elemento.



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



@Component({

    selector: 'app-ng-for',

    template: `

        <ul>

            <li *ngFor="let item de items">{{ item }}</li>

        </ul>

    `

})

export class NgForComponent {

    items = ['Item 1', 'Item 2', 'Item 3'];

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

331. ¿Cómo se utiliza la directiva `ngIf` de Angular para representar elementos condicionalmente?

`ngIf` se usa para incluir o excluir condicionalmente elementos del DOM.



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



@Component({

    selector: 'app-ng-if',

    template: `

        <div *ngIf="isVisible">Visible content</div>

        <button (click)="toggleVisibility()">Toggle Visibility</button>

    `

})

export class NgIfComponent {

    isVisible = true;



    toggleVisibility() {

        this.isVisible = !this.isVisible;

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

332. ¿Cómo se utiliza la directiva `ngSwitch` de Angular para representar elementos condicionalmente?

`ngSwitch` se usa para incluir o excluir elementos condicionalmente según una expresión de cambio.



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



@Component({

    selector: 'app-ng-switch',

    template: `

        <div [ngSwitch]="selectedOption">

            <div *ngSwitchCase="'option1'">Option 1 content</div>

            <div *ngSwitchCase="'option2'">Option 2 content</div>

            <div *ngSwitchDefault>Default content</div>

        </div>

        <button (click)="selectOption('option1')">Select Option 1</button>

        <button (click)="selectOption('option2')">Select Option 2</button>

    `

})

export class NgSwitchComponent {

    selectedOption = 'option1';



    selectOption(option: string) {

        this.selectedOption = option;

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

333. ¿Cómo se utiliza la directiva `ngClass` de Angular para aplicar clases CSS condicionalmente?

`ngClass` le permite aplicar clases CSS condicionalmente a elementos basados en una expresión.



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



@Component({

    selector: 'app-ng-class',

    template: `

        <div [ngClass]="{ 'active': isActive, 'inactive': !isActive }">Content</div>

        <button (click)="toggleStatus()">Toggle Status</button>

    `,

    styles: [`

        .active { color: green; }

        .inactive { color: red; }

    `]

})

export class NgClassComponent {

    isActive = true;



    toggleStatus() {

        this.isActive = !this.isActive;

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

334. ¿Cómo se utiliza la directiva `ngStyle` de Angular para aplicar condicionalmente estilos en línea?

`ngStyle` le permite aplicar estilos en línea condicionalmente a elementos basados ​​en una expresión.



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



@Component({

    selector: 'app-ng-style',

    template: `

        <div [ngStyle]="{ 'color': isActive ? 'green' : 'red' }">Styled Content</div>

        <button (click)="toggleStatus()">Toggle Status</button>

    `

})

export class NgStyleComponent {

    isActive = true;



    toggleStatus() {

        this.isActive = !this.isActive;

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

335. ¿Cómo se utiliza el `ng-container` de Angular para agrupar elementos sin agregar nodos DOM adicionales?

`ng-container` se usa para agrupar elementos y aplicar directivas estructurales sin agregar nodos DOM adicionales.



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



@Component({

    selector: 'app-ng-container',

    template: `

        <ng-container *ngIf="isVisible">

            </ng-container><ng-container *ngIf="isVisible"><p>Visible Content 1</p>

            <p>Visible Content 2</p>

        </ng-container>

    `

})

export class NgContainerComponent {

    isVisible = true;

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

336. ¿Cómo se utiliza `ngModel` de Angular para vincular datos bidireccionalmente?

`ngModel` proporciona enlace de datos bidireccional entre la vista y el componente.



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



@Component({

    selector: 'app-ng-model',

    template: `

        <input [(ngModel)]="data">

        <p>Data: {{ data }}</p>

    `

})

export class NgModelComponent {

    data = 'Initial value';

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

337. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a componentes secundarios o elementos DOM?

`@ViewChild` le permite acceder a componentes secundarios o elementos DOM directamente desde el componente principal.



import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

    selector: 'app-view-child',

    template: `

        <div #myDiv>Content</div>

        <button (click)="changeContent()">Change Content</button>

    `

})

export class ViewChildComponent implements AfterViewInit {

    @ViewChild('myDiv') myDiv!: ElementRef;



    ngAfterViewInit() {

        console.log(this.myDiv.nativeElement.textContent);

    }



    changeContent() {

        this.myDiv.nativeElement.textContent = 'New Content';

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

338. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado?

`@ContentChild` le permite acceder al contenido proyectado dentro de un componente.



import { Component, ContentChild, AfterContentInit, ElementRef } from '@angular/core';



@Component({

    selector: 'app-content-child',

    template: `<ng-content></ng-content>`

})

export class ContentChildComponent implements AfterContentInit {

    @ContentChild('projectedContent') projectedContent!: ElementRef;



    ngAfterContentInit() {

        console.log(this.projectedContent.nativeElement.textContent);

    }

}



@Component({

    selector: 'app-root',

    template: `

        <app-content-child>

            </app-content-child><app-content-child><div #projectedContent>Projected Content</div>

        </app-content-child>

    `

})

export class AppComponent {}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

339. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos DOM?

`@HostListener` se usa para escuchar eventos DOM en el elemento host de la directiva o componente.



import { Directive, HostListener } from '@angular/core';



@Directive({

    selector: '[appHostListener]'

})

export class HostListenerDirective {

    @HostListener('click', ['$event'])

    onClick(event: Event) {

        console.log('Host element clicked', event);

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

340. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular juntos para pasar datos entre componentes?

`@Input` se usa para pasar datos a un componente secundario, mientras que `@Output` se usa para emitir eventos desde el componente secundario.



import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

    selector: 'app-child',

    template: `

        <button (click)="notifyParent()">Notify Parent</button>

    `

})

export class ChildComponent {

    @Input() data: string = '';

    @Output() notify: EventEmitter<void> = new EventEmitter<void>();



    notifyParent() {

        this.notify.emit();

    }

}



@Component({

    selector: 'app-parent',

    template: `

        <app-child [data]="parentData" (notify)="handleNotification()"></app-child>

        <p>Received Data: {{ receivedData }}</p>

    `

})

export class ParentComponent {

    parentData = 'Data from parent';

    receivedData = '';



    handleNotification() {

        this.receivedData = 'Notification received from child!';

    }

}

                

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Avanzado 377 preguntas

Decoradores, guardias e interceptores personalizados en profundidad, rendimiento, arquitectura y refuerzo de producción de una gran aplicación Angular. pagina original

1. ¿Cómo se crea un decorador Angular personalizado?

Para crear un decorador personalizado en Angular, define una función que devuelve una función que se aplica al objetivo. Por ejemplo:

function LogClass(target: Function) {

    console.log("Class:", target);

}



@LogClass

class ExampleClass {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Qué son las Guardias Angulares y cómo se implementan?

Angular Guards son interfaces que le permiten controlar el acceso a las rutas. Se implementan mediante la creación de clases que implementan una o más de las interfaces de protección:

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

import { CanActivate, Router } from '@angular/router';



@Injectable({

  providedIn: 'root'

})

export class AuthGuard implements CanActivate {

  constructor(private router: Router) {}



  canActivate(): boolean {

    const isLoggedIn = /* logic to check if the user is logged in */;

    if (isLoggedIn) {

      return true;

    } else {

      this.router.navigate(['/login']);

      return false;

    }

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se puede crear un formulario dinámico en Angular?

Puedes crear formularios dinámicos usando FormBuilder and FormGroup. Here's an example:

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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

  selector: 'app-dynamic-form',

  template: \`

    <form [formGroup]="form">

      <label for="name">Name:</label>

      <input id="name" formControlName="name">

      <label for="age">Age:</label>

      <input id="age" formControlName="age">

    </form>

  \`

})

export class DynamicFormComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      name: [''],

      age: ['']

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. Explique cómo funciona la estrategia de detección de cambios de Angular.

La estrategia de detección de cambios predeterminada de Angular es CheckAlways, where Angular checks all components to see if they need to be updated. You can use the OnPush strategy to optimize performance, which only checks the component when its inputs change or when an event occurs:

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



@Component({

  selector: 'app-on-push',

  templateUrl: './on-push.component.html',

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class OnPushComponent {

  // Component logic

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se gestiona el estado en las aplicaciones Angular?

La gestión del estado en Angular se puede manejar utilizando bibliotecas como NgRx or Akita. For example, using NgRx involves creating actions, reducers, and selectors:

import { createAction, props } from '@ngrx/store';



export const loadItems = createAction('[Items Page] Load Items');

export const loadItemsSuccess = createAction('[Items API] Items Loaded Success', props<{ items: any[] }>());



import { createReducer, on } from '@ngrx/store';



export const initialState = [];



const _itemsReducer = createReducer(

  initialState,

  on(loadItemsSuccess, (state, { items }) => [...items])

);



export function itemsReducer(state, action) {

  return _itemsReducer(state, action);

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Qué es el sistema de inyección de dependencia de Angular y cómo se utiliza?

La inyección de dependencia (DI) en Angular le permite inyectar dependencias (servicios) en componentes y otros servicios. Puede usarlo definiendo un servicio y luego inyectándolo en un componente:

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



@Injectable({

  providedIn: 'root'

})

export class MyService {

  // Service logic

}



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

import { MyService } from './my.service';



@Component({

  selector: 'app-example',

  template: \`<p>Example component</p>\`

})

export class ExampleComponent {

  constructor(private myService: MyService) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza HttpClient de Angular para realizar solicitudes de API?

el HttpClient module is used to make HTTP requests. Here's an example de making a GET request:

import { HttpClient } from '@angular/common/http';

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



@Component({

  selector: 'app-api',

  template: \`<p>Data: {{ data | json }}</p>\`

})

export class ApiComponent {

  data: any;



  constructor(private http: HttpClient) {

    this.http.get('https://api.example.com/data')

      .subscribe(response => {

        this.data = response;

      });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se puede optimizar el rendimiento de la aplicación Angular?

El rendimiento se puede optimizar utilizando técnicas como carga diferida, trackBy en ngFor y estrategia de detección de cambios OnPush:

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

import { RouterModule, Routes } from '@angular/router';



const routes: Routes = [

  { path: 'feature', loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule) }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule { }



<ng-container *ngFor="let item de items; trackBy: trackById">

  <div>{{ item.name }}</div>

</ng-container>



trackById(index: number, item: any): number {

  return item.id;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. Explique las formas reactivas de Angular y sus ventajas.

Los formularios reactivos proporcionan un enfoque basado en modelos para manejar las entradas del formulario. Ofrecen ventajas como una mejor escalabilidad, pruebas unitarias más sencillas y más control sobre la validación de formularios:

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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

  selector: 'app-reactive-form',

  template: \`

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

      <input formControlName="name">

      <input formControlName="email">

      <button type="submit">Submit</button>

    </form>

  \`

})

export class ReactiveFormComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      name: ['', Validators.required],

      email: ['', [Validators.required, Validators.email]]

    });

  }



  onSubmit() {

    console.log(this.form.value);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se manejan las rutas angulares con parámetros?

Para manejar rutas con parámetros, defina parámetros en la configuración de ruta y acceda a ellos en el componente:

import { ActivatedRoute } from '@angular/router';

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



@Component({

  selector: 'app-route-param',

  template: \`<p>Param: {{ id }}</p>\`

})

export class RouteParamComponent implements OnInit {

  id: string;



  constructor(private route: ActivatedRoute) {}



  ngOnInit() {

    this.route.paramMap.subscribe(params => {

      this.id = params.get('id');

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Qué es NgZone de Angular y cómo se usa?

NgZone allows you to run code inside or outside Angular's change detection. This is useful for optimizing performance:

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



@Component({

  selector: 'app-ngzone',

  template: \`<p>NgZone example</p>\`

})

export class NgZoneComponent {

  constructor(private ngZone: NgZone) {

    this.ngZone.runOutsideAngular(() => {

      // Code that does not trigger change detection

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se crea una biblioteca Angular y se usa en una aplicación?

Cree una biblioteca usando Angular CLI y luego inclúyala en su aplicación:

ng generate library my-lib

ng build my-lib



// In your application module

import { MyLibModule } from 'my-lib';



@NgModule({

  imports: [MyLibModule]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se puede implementar el renderizado del lado del servidor con Angular?

Angular Universal se utiliza para la renderización del lado del servidor (SSR). Permite renderizar aplicaciones Angular en el servidor antes de enviarlas al cliente:

ng add @nguniversal/express-engine



// server.ts

import 'zone.js/dist/zone-node';

import { ngExpressEngine } from '@nguniversal/express-engine';

import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader';

import { AppServerModule } from './src/main.server';



const app = express();

app.engine('html', ngExpressEngine({

  bootstrap: AppServerModule,

  providers: [provideModuleMap(LAZY_MODULE_MAP)]

}));

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se crean tuberías angulares personalizadas?

Las tuberías personalizadas se crean implementando la PipeTransform interface:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'customPipe'

})

export class CustomPipe implements PipeTransform {

  transform(value: string, ...args: any[]): string {

    return value.toUpperCase();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utilizan los validadores integrados de Angular en los formularios?

Angular proporciona varios validadores integrados para formularios:

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

  selector: 'app-validators',

  template: \`

    <form [formGroup]="form">

      <input formControlName="email">

      <input formControlName="password">

    </form>

  \`

})

export class ValidatorsComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      email: ['', [Validators.required, Validators.email]],

      password: ['', [Validators.required, Validators.minLength(6)]]

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Qué es la proyección de contenido de Angular y cómo se utiliza?

La proyección de contenido le permite pasar contenido a la plantilla de un componente. Utilice el <ng-content> directive:

<ng-content></ng-content>



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



@Component({

  selector: 'app-content-projection',

  template: \`

    <div>

      <ng-content></ng-content>

    </div>

  \`

})

export class ContentProjectionComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se implementa la carga diferida de Angular para módulos de funciones?

Los módulos de funciones se pueden cargar de forma diferida configurando rutas con loadChildren:

const routes: Routes = [

  { path: 'feature', loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule) }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se manejan datos asincrónicos con los Observables de Angular?

Los observables se utilizan para manejar datos asincrónicos. Utilice el subscribe method to react to data changes:

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

import { Observable } from 'rxjs';

import { DataService } from './data.service';



@Component({

  selector: 'app-observable',

  template: \`<p>Data: {{ data | json }}</p>\`

})

export class ObservableComponent implements OnInit {

  data$: Observable<any>;



  constructor(private dataService: DataService) {}



  ngOnInit() {

    this.data$ = this.dataService.getData();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Qué es ViewChild de Angular y cómo se utiliza?

ViewChild allows you to access a child component or element in your template:

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

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: \`<app-child #childRef></app-child>\`

})

export class ParentComponent {

  @ViewChild('childRef') childComponent: ChildComponent;



  ngAfterViewInit() {

    console.log(this.childComponent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo manejas los Lifecycle Hooks de Angular?

Los ganchos del ciclo de vida son métodos en Angular que le permiten aprovechar momentos clave del ciclo de vida de un componente:

import { Component, OnInit, OnDestroy } from '@angular/core';



@Component({

  selector: 'app-lifecycle',

  template: \`<p>Lifecycle hooks example</p>\`

})

export class LifecycleComponent implements OnInit, OnDestroy {

  ngOnInit() {

    console.log('Component Initialized');

  }



  ngOnDestroy() {

    console.log('Component Destroyed');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 2

1. ¿Cómo se implementan los validadores personalizados de Angular?

Los validadores personalizados se utilizan para agregar lógica de validación a los controles de formulario. Implemente un validador personalizado creando una función que devuelva nulo o un objeto que indique el error de validación:

import { AbstractControl, ValidatorFn } from '@angular/forms';



export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {

  return (control: AbstractControl): {[key: string]: any} | null => {

    const forbidden = nameRe.test(control.value);

    return forbidden ? { 'forbiddenName': { value: control.value } } : null;

  };

}



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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

  selector: 'app-custom-validator',

  template: \`

    <form [formGroup]="form">

      <input formControlName="name">

      <div *ngIf="form.get('name').hasError('forbiddenName')">

        Name is forbidden

      </div>

    </form>

  \`

})

export class CustomValidatorComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      name: ['', [forbiddenNameValidator(/admin/)]]

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza la inyección de dependencia de Angular para proporcionar múltiples instancias de un servicio?

Para proporcionar varias instancias de un servicio, utilice diferentes proveedores con un token único:

import { Injectable, InjectionToken } from '@angular/core';



export const MY_SERVICE_TOKEN = new InjectionToken<MyService>('MyService');



@Injectable()

export class MyService {

  constructor() {}

}



@NgModule({

  providers: [

    { provide: MY_SERVICE_TOKEN, useClass: MyService }

  ]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se pueden manejar los errores HTTP globalmente en Angular?

Utilice un interceptor HTTP para detectar y manejar errores HTTP:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse } from '@angular/common/http';

import { catchError } from 'rxjs/operators';

import { throwError } from 'rxjs';



@Injectable()

export class ErrorInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler) {

    return next.handle(req).pipe(

      catchError((error: HttpErrorResponse) => {

        console.error('HTTP Error:', error);

        return throwError(error);

      })

    );

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza el enrutador de Angular para manejar rutas secundarias?

Defina rutas secundarias dentro de una configuración de ruta principal:

const routes: Routes = [

  {

    path: 'parent',

    component: ParentComponent,

    children: [

      { path: 'child1', component: Child1Component },

      { path: 'child2', component: Child2Component }

    ]

  }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se puede gestionar el estado de la aplicación Angular con NgRx Effects?

NgRx Effects le permite manejar los efectos secundarios en su aplicación. Cree efectos para escuchar acciones y realizar tareas como solicitudes HTTP:

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

import { Actions, createEffect, ofType } from '@ngrx/effects';

import { MyService } from './my.service';

import { loadItems, loadItemsSuccess } from './actions';

import { switchMap } from 'rxjs/operators';



@Injectable()

export class MyEffects {

  loadItems$ = createEffect(() =>

    this.actions$.pipe(

      ofType(loadItems),

      switchMap(() => this.myService.getItems()

        .pipe(map(items => loadItemsSuccess({ items })))

      )

    )

  );



  constructor(

    private actions$: Actions,

    private myService: MyService

  ) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se crea una directiva angular personalizada?

Las directivas personalizadas se utilizan para ampliar el comportamiento de HTML. Cree una directiva definiendo una clase y usando el @Directive decorator:

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {}



  @HostListener('mouseenter') onMouseEnter() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

  }



  @HostListener('mouseleave') onMouseLeave() {

    this.renderer.removeStyle(this.el.nativeElement, 'backgroundColor');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se puede utilizar `ViewEncapsulation` de Angular para controlar los estilos CSS?

Angular proporciona diferentes estrategias de encapsulación para estilos de componentes. uso ViewEncapsulation to control this:

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



@Component({

  selector: 'app-encapsulation',

  template: \`<p>Encapsulation example</p>\`,

  styles: [\`

    p {

      color: red;

    }

  \`],

  encapsulation: ViewEncapsulation.None

})

export class EncapsulationComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se implementa la carga diferida para módulos Angular?

Utilice el loadChildren property in route configurations to lazy-load modules:

const routes: Routes = [

  { path: 'lazy', loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Qué es `ChangeDetectorRef` de Angular y cómo se usa?

ChangeDetectorRef provides methods to manually trigger change detection in a component:

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



@Component({

  selector: 'app-change-detection',

  template: \`<p>Change detection example</p>\`

})

export class ChangeDetectionComponent {

  constructor(private cdr: ChangeDetectorRef) {}



  detectChanges() {

    this.cdr.detectChanges();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se puede utilizar `Renderer2` de Angular para la manipulación DOM?

Renderer2 is used to safely manipulate the DOM in Angular. Here’s an example de adding a class to an element:

import { Component, ElementRef, Renderer2 } from '@angular/core';



@Component({

  selector: 'app-renderer',

  template: \`<div #myDiv>Renderer2 Example</div>\`

})

export class RendererComponent {

  constructor(private el: ElementRef, private renderer: Renderer2) {}



  ngAfterViewInit() {

    const div = this.el.nativeElement.querySelector('div');

    this.renderer.addClass(div, 'highlight');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `AsyncPipe` de Angular para manejar datos asincrónicos en plantillas?

AsyncPipe allows you to subscribe to observables directly in the template:

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

import { Observable } from 'rxjs';

import { DataService } from './data.service';



@Component({

  selector: 'app-async-pipe',

  template: \`<p>Data: {{ data$ | async | json }}</p>\`

})

export class AsyncPipeComponent implements OnInit {

  data$: Observable<any>;



  constructor(private dataService: DataService) {}



  ngOnInit() {

    this.data$ = this.dataService.getData();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular?

ChangeDetectionStrategy controls how Angular checks for changes in a component. Use ChangeDetectionStrategy.OnPush to optimize performance:

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



@Component({

  selector: 'app-change-detection-strategy',

  template: \`<p>Change Detection Strategy Example</p>\`,

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class ChangeDetectionStrategyComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utilizan los decoradores `HostBinding` y `HostListener` de Angular?

HostBinding and HostListener are used to bind properties and listen to events on the host element:

import { Component, HostBinding, HostListener } from '@angular/core';



@Component({

  selector: 'app-host',

  template: \`<p>Host Binding and Listener Example</p>\`

})

export class HostComponent {

  @HostBinding('class.highlight') isHighlighted = true;



  @HostListener('click') onClick() {

    this.isHighlighted = !this.isHighlighted;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se maneja el gancho del ciclo de vida `ngOnChanges` de Angular?

ngOnChanges is called when an input property value changes:

import { Component, OnChanges, SimpleChanges, Input } from '@angular/core';



@Component({

  selector: 'app-on-changes',

  template: \`<p>On Changes Example</p>\`

})

export class OnChangesComponent implements OnChanges {

  @Input() data: any;



  ngOnChanges(changes: SimpleChanges) {

    console.log('Changes:', changes);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utilizan `ng-container` y `ng-template` de Angular?

ng-container and ng-template are used to manage templates and control the rendering:

<ng-container *ngIf="condition">

  <ng-template #template>

    </ng-template></ng-container><ng-container *ngIf="condition"><ng-template #template><p>Content to render</p>

  </ng-template>

</ng-container>



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



@Component({

  selector: 'app-container',

  template: \`

    <ng-container *ngIf="showContent; else noContent">

      </ng-container><ng-container *ngIf="showContent; else noContent"><p>Content is visible</p>

    </ng-container>

    <ng-template #noContent>

      </ng-template><ng-template #noContent><p>Content is hidden</p>

    </ng-template>

  \`

})

export class ContainerComponent {

  showContent = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se gestionan las configuraciones del entorno de Angular?

Administre las configuraciones del entorno utilizando archivos de entorno:

// environment.ts

export const environment = {

  production: false,

  apiUrl: 'http://localhost:3000'

};



// environment.prod.ts

export const environment = {

  production: true,

  apiUrl: 'https://api.example.com'

};

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se crean las directivas estructurales personalizadas de Angular?

Las directivas estructurales personalizadas se crean utilizando el *ngIf and *ngFor syntax:

import { Directive, TemplateRef, ViewContainerRef } from '@angular/core';



@Directive({

  selector: '[appMyDirective]'

})

export class MyDirective {

  constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) {}



  @Input() set appMyDirective(condition: boolean) {

    this.viewContainer.clear();

    if (condition) {

      this.viewContainer.createEmbeddedView(this.templateRef);

    }

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se puede configurar el manejo global de errores de Angular?

El manejo de errores globales se configura mediante una clase de controlador de errores:

import { Injectable, ErrorHandler } from '@angular/core';



@Injectable()

export class GlobalErrorHandler implements ErrorHandler {

  handleError(error: any) {

    console.error('Global error:', error);

  }

}



@NgModule({

  providers: [{ provide: ErrorHandler, useClass: GlobalErrorHandler }]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se implementa la internacionalización de Angular (i18n)?

La internacionalización se gestiona mediante el paquete Angular i18n:

ng add @angular/localize



// app.component.html

<p i18n="@@hello">Hello</p>



// Extract messages

ng extract-i18n



// Translate and build for a specific locale

ng build --localize

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `Renderer2` de Angular para crear componentes dinámicos?

Renderer2 can be used to dynamically create and manipulate components:

import { Component, ComponentFactoryResolver, ViewChild, ViewContainerRef } from '@angular/core';

import { DynamicComponent } from './dynamic.component';



@Component({

  selector: 'app-dynamic',

  template: \`<ng-template #container></ng-template>\`

})

export class DynamicComponentLoader {

  @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;



  constructor(private resolver: ComponentFactoryResolver) {}



  loadComponent() {

    const factory = this.resolver.resolveComponentFactory(DynamicComponent);

    this.container.clear();

    this.container.createComponent(factory);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 3

1. ¿Cómo se implementan las Custom Pipes de Angular?

Se utilizan canalizaciones personalizadas para transformar datos en la plantilla. Cree una tubería definiendo una clase y usando el @Pipe decorator:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'customPipe'

})

export class CustomPipe implements PipeTransform {

  transform(value: string, ...args: any[]): string {

    return value.toUpperCase();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se puede utilizar `ChangeDetectorRef` de Angular para manejar la detección de cambios manual?

ChangeDetectorRef can be used to manually control change detection, such as when you need to update the view outside de Angular's default change detection cycle:

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



@Component({

  selector: 'app-manual-change',

  template: \`<p>{{ data }}</p>\`

})

export class ManualChangeComponent {

  data = 'Initial data';



  constructor(private cdr: ChangeDetectorRef) {}



  updateData() {

    this.data = 'Updated data';

    this.cdr.detectChanges();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se crean los formularios reactivos de Angular con validadores personalizados?

Los formularios reactivos permiten una lógica de validación más compleja. A continuación se explica cómo crear un formulario con validadores personalizados:

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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

  selector: 'app-reactive-form',

  template: \`

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

      <input formControlName="username">

      <div *ngIf="form.get('username').hasError('forbiddenName')">

        Username is forbidden

      </div>

      <button type="submit">Submit</button>

    </form>

  \`

})

export class ReactiveFormComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      username: ['', [this.forbiddenNameValidator(/admin/)]]

    });

  }



  forbiddenNameValidator(nameRe: RegExp) {

    return (control: AbstractControl): {[key: string]: any} | null => {

      const forbidden = nameRe.test(control.value);

      return forbidden ? { 'forbiddenName': { value: control.value } } : null;

    };

  }



  onSubmit() {

    console.log(this.form.value);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se implementa el cargador de componentes dinámicos de Angular?

Utilice Angular ComponentFactoryResolver to dynamically load components:

import { Component, ComponentFactoryResolver, ViewChild, ViewContainerRef } from '@angular/core';

import { DynamicComponent } from './dynamic.component';



@Component({

  selector: 'app-dynamic-loader',

  template: \`<ng-template #container></ng-template>\`

})

export class DynamicLoaderComponent {

  @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;



  constructor(private resolver: ComponentFactoryResolver) {}



  loadComponent() {

    const factory = this.resolver.resolveComponentFactory(DynamicComponent);

    this.container.clear();

    this.container.createComponent(factory);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se maneja la carga diferida del módulo de Angular?

Los módulos de carga diferida permiten una carga más eficiente de aplicaciones Angular. Defina un módulo con carga diferida en su configuración de enrutamiento:

const routes: Routes = [

  {

    path: 'lazy',

    loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule)

  }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza la tienda `NgRx` de Angular para la gestión del estado?

NgRx proporciona una forma de administrar el estado en aplicaciones Angular mediante una tienda. Definir acciones, reductores y efectos:

import { createAction, createReducer, on } from '@ngrx/store';



// Actions

export const loadItems = createAction('[Item] Load Items');

export const loadItemsSuccess = createAction('[Item] Load Items Success', (items: any[]) => ({ items }));



// Reducer

export const initialState = [];

const _itemsReducer = createReducer(

  initialState,

  on(loadItemsSuccess, (state, { items }) => [...items])

);



export function itemsReducer(state, action) {

  return _itemsReducer(state, action);

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se crean las directivas estructurales personalizadas de Angular?

Las directivas estructurales cambian la estructura del DOM. Cree una directiva estructural personalizada como esta:

import { Directive, TemplateRef, ViewContainerRef, Input } from '@angular/core';



@Directive({

  selector: '[appUnless]'

})

export class UnlessDirective {

  constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) {}



  @Input() set appUnless(condition: boolean) {

    if (!condition) {

      this.viewContainer.createEmbeddedView(this.templateRef);

    } else {

      this.viewContainer.clear();

    }

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se puede utilizar `HostListener` de Angular para escuchar eventos DOM?

HostListener can be used to listen to events on the host element de a component:

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



@Component({

  selector: 'app-host-listener',

  template: \`<p>Host Listener Example</p>\`

})

export class HostListenerComponent {

  @HostListener('click', ['$event'])

  onClick(event: Event) {

    console.log('Host element clicked:', event);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `ng-content` de Angular para la proyección de contenido?

ng-content allows you to project content into a component:

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



@Component({

  selector: 'app-content',

  template: \`<ng-content></ng-content>\`

})

export class ContentComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se pueden utilizar los decoradores `@ContentChild` y `@ContentChildren` de Angular?

@ContentChild and @ContentChildren are used to access content projected into a component:

import { Component, ContentChild, ContentChildren, QueryList } from '@angular/core';



@Component({

  selector: 'app-content-query',

  template: \`<ng-content></ng-content>\`

})

export class ContentQueryComponent {

  @ContentChild('contentRef') contentChild: ElementRef;

  @ContentChildren('contentRef') contentChildren: QueryList<ElementRef>;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se crean los decoradores personalizados de Angular?

Se pueden utilizar decoradores personalizados para agregar metadatos a clases o métodos:

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



export function CustomDecorator(message: string) {

  return createDecorator((target: Function) => {

    target.prototype.customMessage = message;

  });

}



@CustomDecorator('Hello World')

export class CustomClass {

  customMessage: string;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se puede utilizar la inyección de dependencia de Angular para determinar el alcance del servicio?

Los alcances de la inyección de dependencia se pueden controlar utilizando el providedIn property:

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



@Injectable({

  providedIn: 'root'  // Singleton scope

})

export class MyService {}



@Injectable({

  providedIn: 'any'   // Scoped to any module or component

})

export class ScopedService {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se gestiona el interceptor HTTP de Angular para el manejo de solicitudes/respuestas?

Los interceptores HTTP se pueden utilizar para modificar solicitudes y respuestas globalmente:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const authReq = req.clone({

      headers: req.headers.set('Authorization', 'Bearer my-token')

    });

    return next.handle(authReq);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se manejan los Router Guards de Angular para la protección de rutas?

Las protecciones de enrutador se pueden utilizar para proteger rutas según las condiciones:

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

import { CanActivate, Router } from '@angular/router';

import { Observable } from 'rxjs';



@Injectable({

  providedIn: 'root'

})

export class AuthGuard implements CanActivate {

  constructor(private router: Router) {}



  canActivate(): Observable<boolean> | Promise<boolean> | boolean {

    const isAuthenticated = false;  // Implement your authentication check here

    if (!isAuthenticated) {

      this.router.navigate(['/login']);

      return false;

    }

    return true;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `NgModule` de Angular para organizar y administrar su aplicación?

NgModule helps in organizing an application into cohesive blocks de functionality:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { FeatureModule } from './feature/feature.module';



@NgModule({

  declarations: [AppComponent],

  imports: [

    BrowserModule,

    FeatureModule

  ],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se crean los validadores personalizados de Angular para formularios?

Se pueden crear y utilizar validadores personalizados en formularios reactivos:

import { AbstractControl, ValidatorFn } from '@angular/forms';



export function passwordMatchValidator(): ValidatorFn {

  return (control: AbstractControl): {[key: string]: any} | null => {

    const password = control.get('password');

    const confirmPassword = control.get('confirmPassword');

    return password && confirmPassword && password.value !== confirmPassword.value

      ? { 'mismatch': true }

      : null;

  };

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utilizan los decoradores `@ViewChild` y `@ViewChildren` de Angular?

@ViewChild and @ViewChildren are used to query and access elements or directives in the component's view:

import { Component, ViewChild, ViewChildren, QueryList } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: \`

    <app-child #child></app-child>

    <app-child *ngFor="let child de children" #children></app-child>

  \`

})

export class ParentComponent {

  @ViewChild('child') child: ChildComponent;

  @ViewChildren('children') children: QueryList<ChildComponent>;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se maneja la carga diferida de Angular con parámetros de ruta?

La carga diferida de módulos con parámetros de ruta implica pasar parámetros a la ruta y configurar el módulo en consecuencia:

const routes: Routes = [

  {

    path: 'lazy/:id',

    loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule)

  }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se puede utilizar `Renderer2` de Angular para la manipulación DOM?

Renderer2 is used for safe and compatible DOM manipulation:

import { Component, Renderer2, ElementRef } from '@angular/core';



@Component({

  selector: 'app-renderer',

  template: \`<div #box>Content</div>\`

})

export class RendererComponent {

  constructor(private renderer: Renderer2, private el: ElementRef) {}



  changeColor() {

    this.renderer.setStyle(this.el.nativeElement.querySelector('div'), 'color', 'red');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se implementan los ganchos del ciclo de vida `ngOnInit` y `ngAfterViewInit` de Angular?

ngOnInit is called after the component is initialized, while ngAfterViewInit is called after the view has been fully initialized:

import { Component, OnInit, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-lifecycle',

  template: \`<p>Lifecycle Hooks Example</p>\`

})

export class LifecycleComponent implements OnInit, AfterViewInit {

  ngOnInit() {

    console.log('OnInit called');

  }



  ngAfterViewInit() {

    console.log('AfterViewInit called');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 4

1. ¿Cómo se utiliza `NgModule` de Angular para módulos de funciones?

Los módulos de funciones ayudan a organizar una aplicación Angular en bloques cohesivos. A continuación se explica cómo configurar un módulo de funciones:

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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';

import { FeatureRoutingModule } from './feature-routing.module';



@NgModule({

  declarations: [FeatureComponent],

  imports: [

    CommonModule,

    FeatureRoutingModule

  ]

})

export class FeatureModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se crea una directiva angular personalizada?

Las directivas personalizadas se utilizan para ampliar el comportamiento de los elementos. A continuación se muestra un ejemplo de una directiva personalizada:

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {}



  @HostListener('mouseenter') onMouseEnter() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

  }



  @HostListener('mouseleave') onMouseLeave() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'transparent');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se maneja la inyección de dependencia de Angular para múltiples proveedores?

Cuando necesite proporcionar varias instancias o configuraciones de un servicio, puede utilizar tokens de múltiples proveedores:

import { InjectionToken, Injectable, Inject } from '@angular/core';



export const CONFIG = new InjectionToken('app.config');



@Injectable({

  providedIn: 'root'

})

export class ConfigService {

  constructor(@Inject(CONFIG) private config: string[]) {}

}



// In a module

@NgModule({

  providers: [

    { provide: CONFIG, useValue: ['config1', 'config2'], multi: true }

  ]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se optimiza el rendimiento de las aplicaciones Angular?

Para optimizar el rendimiento, puede utilizar técnicas como carga diferida, compilación anticipada (AOT) y estrategias de detección de cambios:

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



@Component({

  selector: 'app-performance',

  templateUrl: './performance.component.html',

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class PerformanceComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo manejas las formas dinámicas de Angular?

Los formularios dinámicos se crean en función de los datos recibidos en tiempo de ejecución. Utilice las formas reactivas de Angular para crear controles dinámicos:

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

import { FormBuilder, FormGroup, FormArray } from '@angular/forms';



@Component({

  selector: 'app-dynamic-form',

  template: \`

    <form [formGroup]="form">

      <div formArrayName="items">

        <div *ngFor="let item de items.controls; let i = index">

          <input [formControlName]="i">

        </div>

      </div>

    </form>

  \`

})

export class DynamicFormComponent implements OnInit {

  form: FormGroup;



  constructor(private fb: FormBuilder) {}



  ngOnInit() {

    this.form = this.fb.group({

      items: this.fb.array([this.fb.control('')])

    });

  }



  get items() {

    return this.form.get('items') as FormArray;

  }



  addItem() {

    this.items.push(this.fb.control(''));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se implementa la carga diferida de Angular con rutas anidadas?

Cargue de forma diferida un módulo con rutas anidadas definiendo rutas secundarias en el módulo de carga diferida:

const routes: Routes = [

  {

    path: 'lazy',

    loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule),

    children: [

      { path: 'child', component: ChildComponent }

    ]

  }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `NgZone` de Angular para ejecutar código fuera de la zona de Angular?

NgZone helps to execute code outside Angular's change detection:

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



@Component({

  selector: 'app-ngzone',

  template: \`<p>NgZone Example</p>\`

})

export class NgZoneComponent {

  constructor(private ngZone: NgZone) {

    this.ngZone.runOutsideAngular(() => {

      // Code running outside Angular's zone

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se maneja el renderizado del lado del servidor (SSR) de Angular con Angular Universal?

Angular Universal le permite realizar renderizado del lado del servidor para mejorar el rendimiento y el SEO. Instale Angular Universal y configúrelo:

ng add @nguniversal/express-engine

// Configure server.ts and other settings

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza el `Router` de Angular para manejar los parámetros de ruta y los parámetros de consulta?

Manejar parámetros de ruta y consulta en componentes angulares:

import { ActivatedRoute } from '@angular/router';



@Component({

  selector: 'app-route',

  template: \`<p>Route Parameter: {{ param }}</p>\`

})

export class RouteComponent implements OnInit {

  param: string;



  constructor(private route: ActivatedRoute) {}



  ngOnInit() {

    this.route.paramMap.subscribe(params => {

      this.param = params.get('id');

    });



    this.route.queryParams.subscribe(queryParams => {

      console.log(queryParams);

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se crean y gestionan los elementos personalizados de Angular?

Crea elementos personalizados con Angular y úsalos en otras aplicaciones:

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

import { createCustomElement } from '@angular/elements';

import { BrowserModule } from '@angular/platform-browser';

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



@Component({

  selector: 'app-custom-element',

  template: \`<p>Custom Element</p>\`

})

export class CustomElementComponent {}



@NgModule({

  declarations: [CustomElementComponent],

  imports: [BrowserModule],

  entryComponents: [CustomElementComponent]

})

export class AppModule {

  constructor(private injector: Injector) {

    const el = createCustomElement(CustomElementComponent, { injector });

    customElements.define('custom-element', el);

  }



  ngDoBootstrap() {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se maneja el `HttpClient` de Angular para operaciones HTTP avanzadas?

uso HttpClient for advanced HTTP operations like interceptors, retries, and request caching:

import { HttpClient, HttpHeaders } from '@angular/common/http';

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

import { catchError, retry } from 'rxjs/operators';



@Injectable({

  providedIn: 'root'

})

export class ApiService {

  constructor(private http: HttpClient) {}



  getData() {

    return this.http.get('https://api.example.com/data', {

      headers: new HttpHeaders({

        'Authorization': 'Bearer my-token'

      })

    }).pipe(

      retry(3),

      catchError(this.handleError)

    );

  }



  private handleError(error: any) {

    console.error('An error occurred', error);

    return throwError(error);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se gestiona la internacionalización (i18n) y la localización de Angular?

La internacionalización y localización implican traducir su aplicación a diferentes idiomas:

ng add @angular/localize

// Use i18n attributes in templates

// Configure locales and translations

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `Renderer2` de Angular para manipular de forma segura el DOM?

Renderer2 provides a way to safely interact with the DOM:

import { Component, Renderer2, ElementRef } from '@angular/core';



@Component({

  selector: 'app-renderer2',

  template: \`<p>Renderer2 Example</p>\`

})

export class Renderer2Component {

  constructor(private renderer: Renderer2, private el: ElementRef) {

    this.renderer.setStyle(this.el.nativeElement, 'color', 'blue');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se manejan las animaciones de Angular con la biblioteca de Angular Animations?

Utilice la API de animación de Angular para crear animaciones complejas:

import { trigger, transition, style, animate } from '@angular/animations';



@Component({

  selector: 'app-animation',

  template: \`<div [@fadeInOut]="state">Content</div>\`,

  animations: [

    trigger('fadeInOut', [

      transition(':enter', [

        style({ opacity: 0 }),

        animate('1s', style({ opacity: 1 }))

      ]),

      transition(':leave', [

        animate('1s', style({ opacity: 0 }))

      ])

    ])

  ]

})

export class AnimationComponent {

  state = 'in';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se gestiona la estrategia de detección de cambios de Angular para optimizar el rendimiento?

Optimice el rendimiento mediante el uso ChangeDetectionStrategy.OnPush:

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



@Component({

  selector: 'app-optimization',

  template: \`<p>Optimization Example</p>\`,

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class OptimizationComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se implementan los decoradores `@ContentChild` y `@ContentChildren` de Angular?

uso @ContentChild and @ContentChildren to query and access projected content:

import { Component, ContentChild, ContentChildren, QueryList } from '@angular/core';

import { ContentComponent } from './content.component';



@Component({

  selector: 'app-parent',

  template: \`<ng-content></ng-content>\`

})

export class ParentComponent {

  @ContentChild(ContentComponent) content: ContentComponent;

  @ContentChildren(ContentComponent) contentChildren: QueryList<ContentComponent>;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utilizan los decoradores `@HostListener` y `@HostBinding` de Angular?

uso @HostListener to listen to events on the host element and @HostBinding to bind properties:

import { Component, HostListener, HostBinding } from '@angular/core';



@Component({

  selector: 'app-host',

  template: \`<p>Host Binding and Listener Example</p>\`

})

export class HostComponent {

  @HostBinding('class.active') isActive = true;



  @HostListener('click') onClick() {

    this.isActive = !this.isActive;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `NgModel` de Angular con enlace de datos bidireccional?

NgModel enables two-way data binding in Angular forms:

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



@Component({

  selector: 'app-model',

  template: \`

    <input [(ngModel)]="value">

    <p>Value: {{ value }}</p>

  \`

})

export class ModelComponent {

  value = '';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se configura el cliente HTTP de Angular para manejar el manejo de errores globales?

El manejo de errores globales se puede configurar con interceptores HTTP:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable, throwError } from 'rxjs';

import { catchError } from 'rxjs/operators';



@Injectable()

export class ErrorInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return next.handle(req).pipe(

      catchError(error => {

        console.error('An error occurred', error);

        return throwError(error);

      })

    );

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se implementa el trabajador de servicio de Angular para aplicaciones web progresivas (PWA)?

Configure un trabajador de servicio para habilitar las funciones de PWA:

ng add @angular/pwa

// Configure ngsw-config.json for caching strategies

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 5

1. ¿Cómo se implementa la carga dinámica de componentes de Angular?

La carga dinámica de componentes le permite cargar componentes en tiempo de ejecución. uso ComponentFactoryResolver:

import { Component, ComponentFactoryResolver, ViewChild, ViewContainerRef } from '@angular/core';

import { DynamicComponent } from './dynamic.component';



@Component({

  selector: 'app-dynamic-loader',

  template: \`<ng-template #container></ng-template>\`

})

export class DynamicLoaderComponent {

  @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;



  constructor(private cfr: ComponentFactoryResolver) {}



  loadComponent() {

    const factory = this.cfr.resolveComponentFactory(DynamicComponent);

    this.container.createComponent(factory);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utilizan los decoradores `@Inject` y `@Optional` de Angular?

@Inject is used for dependency injection with tokens, while @Optional allows you to handle missing dependencies:

import { Injectable, Inject, Optional } from '@angular/core';



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Inject('TOKEN') @Optional() private token: string) {

    if (!token) {

      console.log('No token provided');

    }

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza `@ViewChild` de Angular con opciones `estáticas` y `dinámicas`?

@ViewChild with static or dynamic allows you to control when the view query is resolved:

import { Component, ViewChild, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-viewchild',

  template: \`<p #paragraph>Text</p>\`

})

export class ViewChildComponent implements AfterViewInit {

  @ViewChild('paragraph', { static: true }) paragraph;



  ngAfterViewInit() {

    console.log(this.paragraph.nativeElement.textContent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se implementa la gestión del estado de Angular con NgRx?

NgRx proporciona una forma de gestionar el estado en aplicaciones Angular utilizando los principios de Redux. Configure acciones, reductores y efectos:

import { createAction, props } from '@ngrx/store';



export const loadItems = createAction('[Items Page] Load Items');

export const loadItemsSuccess = createAction('[Items API] Load Items Success', props<{ items: any[] }>());

export const loadItemsFailure = createAction('[Items API] Load Items Failure', props<{ error: any }>());

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `@NgModule` de Angular para la carga diferida y la configuración de rutas?

Configure módulos con carga diferida en el módulo de enrutamiento de su aplicación:

const routes: Routes = [

  {

    path: 'feature',

    loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule)

  }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se implementa la validación de formulario reactivo de Angular con validadores personalizados?

Cree validadores personalizados para formularios reactivos:

import { AbstractControl, ValidatorFn } from '@angular/forms';



export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {

  return (control: AbstractControl): { [key: string]: any } | null => {

    const forbidden = nameRe.test(control.value);

    return forbidden ? { 'forbiddenName': { value: control.value } } : null;

  };

}



// Usage in a form

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

  selector: 'app-custom-validation',

  template: \`

    <form [formGroup]="form">

      <input formControlName="name">

      <div *ngIf="form.controls.name.errors?.forbiddenName">

        Name is forbidden

      </div>

    </form>

  \`

})

export class CustomValidationComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      name: ['', [forbiddenNameValidator(/admin/)]]

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `@ContentChildren` de Angular para consultar varios elementos?

uso @ContentChildren to query multiple projected elements:

import { Component, ContentChildren, QueryList, AfterContentInit } from '@angular/core';

import { ContentComponent } from './content.component';



@Component({

  selector: 'app-parent',

  template: \`<ng-content></ng-content>\`

})

export class ParentComponent implements AfterContentInit {

  @ContentChildren(ContentComponent) contentComponents: QueryList<ContentComponent>;



  ngAfterContentInit() {

    this.contentComponents.forEach(component => {

      console.log(component.someProperty);

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se manejan los protectores del enrutador de Angular para obtener autorización?

Los protectores del enrutador ayudan a administrar la navegación según condiciones como la autenticación:

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

import { CanActivate, Router } from '@angular/router';



@Injectable({

  providedIn: 'root'

})

export class AuthGuard implements CanActivate {

  constructor(private router: Router) {}



  canActivate(): boolean {

    const isAuthenticated = false; // Replace with real authentication check

    if (!isAuthenticated) {

      this.router.navigate(['/login']);

    }

    return isAuthenticated;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `@ViewEncapsulation` de Angular para controlar los estilos de los componentes?

Controle la encapsulación de estilos de componentes con @ViewEncapsulation:

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



@Component({

  selector: 'app-encapsulation',

  template: \`<p>Encapsulation Example</p>\`,

  styles: [\`

    p {

      color: red;

    }

  \`],

  encapsulation: ViewEncapsulation.None

})

export class EncapsulationComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se implementa `@HostListener` de Angular para escuchar eventos en el elemento host?

uso @HostListener to listen to events like click or hover:

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



@Component({

  selector: 'app-host-listener',

  template: \`<p>Host Listener Example</p>\`

})

export class HostListenerComponent {

  @HostListener('click', ['$event'])

  onClick(event: Event) {

    console.log('Element clicked', event);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@HostBinding` de Angular para vincular propiedades al elemento host?

@HostBinding allows you to bind properties like classes or styles:

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



@Component({

  selector: 'app-host-binding',

  template: \`<p>Host Binding Example</p>\`

})

export class HostBindingComponent {

  @HostBinding('class.active') isActive = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se implementa `@Injectable` de Angular con inyectores jerárquicos?

uso @Injectable with providedIn to control hierarchical injection:

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



@Injectable({

  providedIn: 'root' // Hierarchical injectors are created with this configuration

})

export class MyService {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza la inyección de dependencia de Angular con los proveedores de fábrica?

Los proveedores de fábrica permiten la creación de instancias personalizadas de servicios:

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



export function myServiceFactory() {

  return new MyService();

}



@NgModule({

  providers: [

    { provide: MyService, useFactory: myServiceFactory }

  ]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `@Inject` de Angular para inyectar valores en los servicios?

Inyectar valores usando tokens y @Inject:

import { Injectable, InjectionToken, Inject } from '@angular/core';



export const MY_TOKEN = new InjectionToken<string>('MyToken');



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Inject(MY_TOKEN) private token: string) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se implementa el cliente HTTP de Angular con interceptores para autenticación?

Utilice interceptores HTTP para modificar solicitudes y respuestas:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const authReq = req.clone({

      headers: req.headers.set('Authorization', 'Bearer token')

    });

    return next.handle(authReq);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `@NgModule` de Angular para configurar servicios para toda la aplicación?

Configurar servicios para toda la aplicación en @NgModule:

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

import { AppComponent } from './app.component';

import { MyService } from './my.service';



@NgModule({

  declarations: [AppComponent],

  imports: [],

  providers: [MyService],

  bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se implementa `@ViewChild` de Angular para acceder a los componentes secundarios?

Acceda a componentes secundarios con @ViewChild:

import { Component, ViewChild, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: \`<app-child></app-child>\`

})

export class ParentComponent implements AfterViewInit {

  @ViewChild(ChildComponent) childComponent: ChildComponent;



  ngAfterViewInit() {

    console.log(this.childComponent.someMethod());

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se implementa `ChangeDetectorRef` de Angular para la detección manual de cambios?

uso ChangeDetectorRef for manual change detection:

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



@Component({

  selector: 'app-manual-detection',

  template: \`<p>Manual Detection Example</p>\`

})

export class ManualDetectionComponent {

  constructor(private cdr: ChangeDetectorRef) {}



  triggerChangeDetection() {

    this.cdr.detectChanges();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@NgModule` de Angular para definir módulos de funciones y carga diferida?

Definir módulos de funciones y configurar la carga diferida en @NgModule:

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

import { RouterModule, Routes } from '@angular/router';



const routes: Routes = [

  {

    path: 'feature',

    loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule)

  }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `@Injectable` de Angular para la inyección de dependencia jerárquica?

Gestionar dependencias jerárquicas con @Injectable:

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



@Injectable({

  providedIn: 'root' // or 'platform' or 'any'

})

export class MyService {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 6

1. ¿Cómo se utiliza `@Directive` de Angular para crear directivas personalizadas?

Defina directivas personalizadas para ampliar el comportamiento HTML:

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {}



  @HostListener('mouseenter') onMouseEnter() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

  }



  @HostListener('mouseleave') onMouseLeave() {

    this.renderer.removeStyle(this.el.nativeElement, 'backgroundColor');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se implementan las tuberías personalizadas de Angular?

Cree canalizaciones personalizadas para transformar datos en plantillas:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'reverse'

})

export class ReversePipe implements PipeTransform {

  transform(value: string): string {

    return value.split('').reverse().join('');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo maneja `@Input` y `@Output` de Angular para la comunicación entre padres e hijos?

uso @Input to pass data from parent to child, and @Output to emit events from child to parent:

import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

  selector: 'app-child',

  template: \`<button (click)="notify()">Notify Parent</button>\`

})

export class ChildComponent {

  @Input() data: string;

  @Output() notify = new EventEmitter<string>();



  notifyParent() {

    this.notify.emit('Message from child');

  }

}



@Component({

  selector: 'app-parent',

  template: \`<app-child [data]="parentData" (notify)="onNotify($event)"></app-child>\`

})

export class ParentComponent {

  parentData = 'Data from parent';



  onNotify(message: string) {

    console.log(message);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `@NgModule` de Angular para configurar módulos con carga diferida y protectores de ruta?

Configure módulos con carga diferida y guardias de ruta en su módulo de enrutamiento:

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

import { RouterModule, Routes } from '@angular/router';

import { AuthGuard } from './auth.guard';



const routes: Routes = [

  {

    path: 'admin',

    loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule),

    canActivate: [AuthGuard]

  }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `@NgModule` de Angular para configurar proveedores para la inyección de dependencia?

Proporcionar servicios a diferentes niveles utilizando @NgModule:

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

import { CommonModule } from '@angular/common';

import { MyService } from './my.service';



@NgModule({

  imports: [CommonModule],

  providers: [MyService]

})

export class FeatureModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos DOM en el elemento host?

Escuche eventos DOM usando @HostListener:

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



@Component({

  selector: 'app-host-listener',

  template: \`<p>Click me!</p>\`

})

export class HostListenerComponent {

  @HostListener('click', ['$event'])

  onClick(event: Event) {

    console.log('Element clicked:', event);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se implementa `@ContentChild` y `@ContentChildren` de Angular para consultar el contenido proyectado en un componente?

uso @ContentChild and @ContentChildren to query projected content:

import { Component, ContentChild, ContentChildren, QueryList, AfterContentInit } from '@angular/core';

import { ContentComponent } from './content.component';



@Component({

  selector: 'app-container',

  template: \`<ng-content></ng-content>\`

})

export class ContainerComponent implements AfterContentInit {

  @ContentChild(ContentComponent) contentChild: ContentComponent;

  @ContentChildren(ContentComponent) contentChildren: QueryList<ContentComponent>;



  ngAfterContentInit() {

    console.log(this.contentChild);

    this.contentChildren.forEach(child => console.log(child));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se maneja la carga dinámica de componentes de Angular con `ComponentFactoryResolver`?

Cargue componentes dinámicamente usando ComponentFactoryResolver:

import { Component, ComponentFactoryResolver, ViewChild, ViewContainerRef } from '@angular/core';

import { DynamicComponent } from './dynamic.component';



@Component({

  selector: 'app-dynamic',

  template: \`<ng-template #container></ng-template>\`

})

export class DynamicComponentLoader {

  @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;



  constructor(private cfr: ComponentFactoryResolver) {}



  loadComponent() {

    const factory = this.cfr.resolveComponentFactory(DynamicComponent);

    this.container.createComponent(factory);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular para optimizar el rendimiento?

Optimice el rendimiento utilizando ChangeDetectionStrategy.OnPush:

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



@Component({

  selector: 'app-optimization',

  template: \`<p>Change Detection Strategy</p>\`,

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class OptimizationComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `NgZone` de Angular para controlar la detección de cambios?

Detección de cambios de control con NgZone:

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



@Component({

  selector: 'app-ngzone',

  template: \`<p>NgZone Example</p>\`

})

export class NgZoneComponent {

  constructor(private ngZone: NgZone) {

    this.ngZone.runOutsideAngular(() => {

      setTimeout(() => {

        this.ngZone.run(() => console.log('Change detection triggered'));

      }, 1000);

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP y manejar respuestas?

Realizar solicitudes HTTP utilizando HttpClient:

import { HttpClient } from '@angular/common/http';

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

import { Observable } from 'rxjs';



@Component({

  selector: 'app-http',

  template: \`<p>HTTP Request Example</p>\`

})

export class HttpComponent {

  constructor(private http: HttpClient) {}



  getData(): Observable<any> {

    return this.http.get('https://api.example.com/data');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@Injectable` de Angular para proporcionar servicios en diferentes niveles de la jerarquía de inyectores?

Definir proveedores de servicios en diferentes niveles:

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



@Injectable({

  providedIn: 'root' // Service provided at the root level

})

export class MyService {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `NgModule` de Angular para configurar proveedores para bibliotecas de terceros?

Configurar proveedores de bibliotecas de terceros en @NgModule:

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

import { SomeLibraryModule, SomeService } from 'some-library';



@NgModule({

  imports: [SomeLibraryModule],

  providers: [SomeService]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza el `Router` de Angular para manejar los parámetros de ruta y los parámetros de consulta?

Acceda a la ruta y consulte los parámetros usando Router:

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

import { ActivatedRoute } from '@angular/router';



@Component({

  selector: 'app-route',

  template: \`<p>Route Example</p>\`

})

export class RouteComponent implements OnInit {

  constructor(private route: ActivatedRoute) {}



  ngOnInit() {

    this.route.paramMap.subscribe(params => {

      const id = params.get('id');

      console.log('Route parameter id:', id);

    });



    this.route.queryParamMap.subscribe(params => {

      const filter = params.get('filter');

      console.log('Query parameter filter:', filter);

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `@Directive` de Angular para crear directivas estructurales?

Cree directivas estructurales para manipular el diseño DOM:

import { Directive, TemplateRef, ViewContainerRef } from '@angular/core';



@Directive({

  selector: '[appUnless]'

})

export class UnlessDirective {

  constructor(private templateRef: TemplateRef<any>, private vcr: ViewContainerRef) {}



  set appUnless(condition: boolean) {

    if (!condition) {

      this.vcr.createEmbeddedView(this.templateRef);

    } else {

      this.vcr.clear();

    }

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `@Component` de Angular para administrar la encapsulación de vistas?

Controlar la encapsulación de vistas con encapsulation property:

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



@Component({

  selector: 'app-encapsulation',

  template: \`<p>View Encapsulation Example</p>\`,

  encapsulation: ViewEncapsulation.None // or Emulated, Native

})

export class EncapsulationComponent {}



            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `@NgModule` de Angular para configurar los módulos raíz y de funciones?

Defina módulos raíz y de funciones en su aplicación:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { FeatureModule } from './feature/feature.module';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule, FeatureModule],

  bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `@NgModule` de Angular para configurar proveedores e importaciones de módulos de funciones?

Configure proveedores e importaciones en módulos de funciones:

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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';

import { FeatureService } from './feature.service';



@NgModule({

  declarations: [FeatureComponent],

  imports: [CommonModule],

  providers: [FeatureService]

})

export class FeatureModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@Injectable` de Angular para configurar dependencias jerárquicas?

Gestionar dependencias jerárquicas utilizando @Injectable:

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



@Injectable({

  providedIn: 'root' // or 'platform', 'any'

})

export class HierarchicalService {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se maneja la detección de cambios de Angular con `ChangeDetectorRef` y `NgZone`?

combinar ChangeDetectorRef and NgZone to control change detection:

import { Component, ChangeDetectorRef, NgZone } from '@angular/core';



@Component({

  selector: 'app-change-detection',

  template: \`<p>Change Detection Example</p>\`

})

export class ChangeDetectionComponent {

  constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) {}



  triggerChangeDetection() {

    this.ngZone.run(() => this.cdr.detectChanges());

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

Preguntas de nivel avanzado de Angular - Parte 7

1. ¿Cómo se utiliza `@Inject` de Angular para la inyección de dependencia?

uso @Inject to specify the token for dependency injection:

import { Injectable, Inject } from '@angular/core';

import { MY_TOKEN } from './tokens';



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Inject(MY_TOKEN) private myValue: string) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `@Optional` de Angular para manejar dependencias opcionales?

uso @Optional to inject dependencies that may or may not be provided:

import { Injectable, Optional } from '@angular/core';



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Optional() private optionalDependency?: SomeService) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza el gancho del ciclo de vida `ngAfterViewInit` de Angular?

implementar ngAfterViewInit to perform actions after the component's view has been initialized:

import { Component, AfterViewInit, ViewChild, ElementRef } from '@angular/core';



@Component({

  selector: 'app-after-view',

  template: \`<p #pElement>Content</p>\`

})

export class AfterViewComponent implements AfterViewInit {

  @ViewChild('pElement') pElement: ElementRef;



  ngAfterViewInit() {

    console.log(this.pElement.nativeElement.textContent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza el gancho del ciclo de vida `ngOnChanges` de Angular para detectar cambios en las propiedades de entrada?

uso ngOnChanges to react to changes in input properties:

import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';



@Component({

  selector: 'app-on-changes',

  template: \`<p>{{inputProp}}</p>\`

})

export class OnChangesComponent implements OnChanges {

  @Input() inputProp: string;



  ngOnChanges(changes: SimpleChanges) {

    console.log('Changes:', changes);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `ngDoCheck` de Angular para implementar la detección de cambios personalizada?

implementar ngDoCheck to customize change detection behavior:

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



@Component({

  selector: 'app-do-check',

  template: \`<p>Custom Change Detection</p>\`

})

export class DoCheckComponent implements DoCheck {

  ngDoCheck() {

    console.log('Custom change detection');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `ngOnInit` de Angular para inicializar los datos del componente?

Inicializar datos usando ngOnInit:

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



@Component({

  selector: 'app-on-init',

  template: \`<p>Initialized Data: {{data}}</p>\`

})

export class OnInitComponent implements OnInit {

  data: string;



  ngOnInit() {

    this.data = 'Initial Data';

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `ngOnDestroy` de Angular para limpiar recursos?

uso ngOnDestroy to perform cleanup tasks:

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



@Component({

  selector: 'app-on-destroy',

  template: \`<p>Cleanup Example</p>\`

})

export class OnDestroyComponent implements OnDestroy {

  ngOnDestroy() {

    console.log('Cleanup tasks');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza `@ViewChild` de Angular para obtener una referencia a un componente secundario o elemento DOM?

Acceda a componentes secundarios o elementos DOM usando @ViewChild:

import { Component, ViewChild, ElementRef } from '@angular/core';



@Component({

  selector: 'app-view-child',

  template: \`<input #inputElement>\`

})

export class ViewChildComponent {

  @ViewChild('inputElement') inputElement: ElementRef;



  ngAfterViewInit() {

    this.inputElement.nativeElement.focus();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `@ContentChild` de Angular para obtener una referencia a un contenido proyectado?

Consultar contenido proyectado usando @ContentChild:

import { Component, ContentChild, AfterContentInit } from '@angular/core';

import { ContentComponent } from './content.component';



@Component({

  selector: 'app-content-child',

  template: \`<ng-content></ng-content>\`

})

export class ContentChildComponent implements AfterContentInit {

  @ContentChild(ContentComponent) contentChild: ContentComponent;



  ngAfterContentInit() {

    console.log(this.contentChild);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utilizan `@ViewChildren` y `@ContentChildren` de Angular para consultar múltiples elementos o componentes?

Consulta múltiples elementos o componentes usando @ViewChildren and @ContentChildren:

import { Component, ViewChildren, QueryList, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-view-children',

  template: \`<app-child></app-child><app-child></app-child>\`

})

export class ViewChildrenComponent implements AfterViewInit {

  @ViewChildren(ChildComponent) children: QueryList<ChildComponent>;



  ngAfterViewInit() {

    this.children.forEach(child => console.log(child));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@HostBinding` de Angular para vincular las propiedades del elemento host?

uso @HostBinding to bind properties to the host element:

import { Directive, HostBinding } from '@angular/core';



@Directive({

  selector: '[appHostBinding]'

})

export class HostBindingDirective {

  @HostBinding('class.highlight') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos en el elemento host?

Escuche eventos en el elemento anfitrión usando @HostListener:

import { Directive, HostListener } from '@angular/core';



@Directive({

  selector: '[appHostListener]'

})

export class HostListenerDirective {

  @HostListener('mouseenter') onMouseEnter() {

    console.log('Mouse entered');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@Pipe` de Angular para transformar datos en plantillas?

Cree una tubería personalizada para transformar datos:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'customPipe'

})

export class CustomPipe implements PipeTransform {

  transform(value: string): string {

    return value.toUpperCase();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `NgZone` de Angular para gestionar la detección de cambios manualmente?

uso NgZone to control change detection:

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



@Component({

  selector: 'app-ng-zone',

  template: \`<p>NgZone Example</p>\`

})

export class NgZoneComponent {

  constructor(private ngZone: NgZone) {}



  runOutsideAngular() {

    this.ngZone.runOutsideAngular(() => {

      // Code that doesn't trigger change detection

    });

  }



  runInsideAngular() {

    this.ngZone.run(() => {

      // Code that triggers change detection

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `Renderer2` de Angular para manipular el DOM?

uso Renderer2 for DOM manipulation:

import { Component, Renderer2, ElementRef } from '@angular/core';



@Component({

  selector: 'app-renderer',

  template: \`<p>Renderer2 Example</p>\`

})

export class RendererComponent {

  constructor(private renderer: Renderer2, private el: ElementRef) {}



  ngAfterViewInit() {

    this.renderer.setStyle(this.el.nativeElement.querySelector('p'), 'color', 'blue');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

Activar manualmente la detección de cambios usando ChangeDetectorRef:

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



@Component({

  selector: 'app-change-detector',

  template: \`<p>Change Detection Example</p>\`

})

export class ChangeDetectorComponent {

  constructor(private cdr: ChangeDetectorRef) {}



  triggerChangeDetection() {

    this.cdr.detectChanges();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `HttpInterceptor` de Angular para manejar solicitudes y respuestas HTTP?

implementar HttpInterceptor to intercept HTTP requests and responses:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const authReq = req.clone({

      headers: req.headers.set('Authorization', 'Bearer token')

    });

    return next.handle(authReq);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 9

1. ¿Cómo se utiliza `NgModule` de Angular para configurar un módulo con proveedores personalizados?

Configure un módulo con proveedores personalizados usando @NgModule:

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

import { CommonModule } from '@angular/common';

import { MyComponent } from './my-component.component';

import { MyService } from './my-service.service';



@NgModule({

  declarations: [MyComponent],

  imports: [CommonModule],

  providers: [

    { provide: MyService, useClass: MyCustomService }

  ]

})

export class MyModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `@Input` de Angular para vincular los datos del componente principal a los componentes secundarios?

Vincular datos principales a componentes secundarios utilizando @Input:

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



@Component({

  selector: 'app-child',

  template: \`<p>{{parentData}}</p>\`

})

export class ChildComponent {

  @Input() parentData: string;

}



@Component({

  selector: 'app-parent',

  template: \`<app-child [parentData]="data"></app-child>\`

})

export class ParentComponent {

  data = 'Data from parent';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza `@Output` de Angular para emitir eventos desde componentes secundarios a componentes principales?

Emitir eventos de niño a padre usando @Output:

import { Component, Output, EventEmitter } from '@angular/core';



@Component({

  selector: 'app-child',

  template: \`<button (click)="notifyParent()">Notify</button>\`

})

export class ChildComponent {

  @Output() notify: EventEmitter<string> = new EventEmitter<string>();



  notifyParent() {

    this.notify.emit('Message from child');

  }

}



@Component({

  selector: 'app-parent',

  template: \`<app-child (notify)="receiveMessage($event)"></app-child>\`

})

export class ParentComponent {

  receiveMessage(message: string) {

    console.log(message);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `@HostBinding` de Angular para vincular propiedades del host?

Vincular propiedades del host usando @HostBinding:

import { Directive, HostBinding } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  @HostBinding('style.backgroundColor') backgroundColor = 'yellow';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos del host?

Escuche eventos del anfitrión usando @HostListener:

import { Directive, HostListener } from '@angular/core';



@Directive({

  selector: '[appHover]'

})

export class HoverDirective {

  @HostListener('mouseenter') onMouseEnter() {

    console.log('Mouse entered');

  }



  @HostListener('mouseleave') onMouseLeave() {

    console.log('Mouse left');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular para optimizar el rendimiento?

Optimice el rendimiento utilizando ChangeDetectionStrategy:

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



@Component({

  selector: 'app-optimized',

  template: \`<p>Optimized Change Detection</p>\`,

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class OptimizedComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

Activar manualmente la detección de cambios usando ChangeDetectorRef:

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



@Component({

  selector: 'app-manual-detection',

  template: \`<p>Manual Change Detection</p>\`

})

export class ManualDetectionComponent {

  constructor(private cdr: ChangeDetectorRef) {}



  triggerChangeDetection() {

    this.cdr.detectChanges();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza `Renderer2` de Angular para manipular de forma segura el DOM?

Manipule de forma segura el DOM usando Renderer2:

import { Component, Renderer2, ElementRef } from '@angular/core';



@Component({

  selector: 'app-dom-manipulation',

  template: \`<p>DOM Manipulation Example</p>\`

})

export class DomManipulationComponent {

  constructor(private renderer: Renderer2, private el: ElementRef) {}



  ngAfterViewInit() {

    this.renderer.setStyle(this.el.nativeElement.querySelector('p'), 'color', 'blue');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `HttpInterceptor` de Angular para modificar solicitudes y respuestas HTTP?

Modifique las solicitudes y respuestas HTTP usando HttpInterceptor:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class MyInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const modifiedReq = req.clone({

      headers: req.headers.set('Authorization', 'Bearer your-token')

    });

    return next.handle(modifiedReq);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `NgZone` de Angular para ejecutar código dentro o fuera de la detección de cambios de Angular?

Ejecute código dentro o fuera de la detección de cambios usando NgZone:

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



@Component({

  selector: 'app-ng-zone',

  template: \`<p>NgZone Example</p>\`

})

export class NgZoneComponent {

  constructor(private ngZone: NgZone) {}



  runOutsideAngular() {

    this.ngZone.runOutsideAngular(() => {

      // Code not affecting Angular change detection

    });

  }



  runInsideAngular() {

    this.ngZone.run(() => {

      // Code affecting Angular change detection

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `NgModule` de Angular para configurar el enrutamiento con módulos de funciones cargados de forma diferida?

Configure el enrutamiento con módulos de carga diferida usando NgModule:

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

import { RouterModule, Routes } from '@angular/router';



const routes: Routes = [

  {

    path: 'feature',

    loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule)

  }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza el decorador `@Component` de Angular para definir plantillas y estilos personalizados?

Defina plantillas y estilos personalizados usando @Component:

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



@Component({

  selector: 'app-custom',

  template: \`<p>Custom Template</p>\`,

  styles: [\`p { color: red; } \`]

})

export class CustomComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@Injectable` de Angular para configurar la inyección de dependencia en los servicios?

Configurar la inyección de dependencia en servicios usando @Injectable:

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



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor() {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `FormArray` de Angular para gestionar formularios dinámicos?

Administrar formularios dinámicos usando FormArray:

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

import { FormBuilder, FormGroup, FormArray } from '@angular/forms';



@Component({

  selector: 'app-dynamic-form',

  template: \`

    <form [formGroup]="form">

      <div formArrayName="items">

        <div *ngFor="let item de items.controls; let i = index">

          <input [formControlName]="i" />

        </div>

      </div>

    </form>

    <button (click)="addItem()">Add Item</button>

  \`

})

export class DynamicFormComponent {

  form: FormGroup;



  get items() {

    return this.form.get('items') as FormArray;

  }



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      items: this.fb.array([])

    });

  }



  addItem() {

    this.items.push(this.fb.control(''));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `ActivatedRoute` de Angular para acceder a los parámetros de ruta?

Acceda a los parámetros de ruta usando ActivatedRoute:

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

import { ActivatedRoute } from '@angular/router';



@Component({

  selector: 'app-route-params',

  template: \`<p>Route Parameter: {{ id }}</p>\`

})

export class RouteParamsComponent implements OnInit {

  id: string;



  constructor(private route: ActivatedRoute) {}



  ngOnInit() {

    this.route.paramMap.subscribe(params => {

      this.id = params.get('id');

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza el `Router` de Angular para navegar mediante programación?

Navegar programáticamente usando Router:

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

import { Router } from '@angular/router';



@Component({

  selector: 'app-navigation',

  template: \`<button (click)="navigate()">Navigate</button>\`

})

export class NavigationComponent {

  constructor(private router: Router) {}



  navigate() {

    this.router.navigate(['/path']);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `@NgModule` de Angular para proporcionar un servicio singleton en toda la aplicación?

Proporcione un servicio singleton en toda la aplicación utilizando @NgModule:

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

import { MyService } from './my-service.service';



@NgModule({

  providers: [MyService]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `HttpClient` de Angular para manejar operaciones HTTP?

Manejar operaciones HTTP usando HttpClient:

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

import { HttpClient } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable({

  providedIn: 'root'

})

export class DataService {

  constructor(private http: HttpClient) {}



  getData(): Observable<any> {

    return this.http.get('https://api.example.com/data');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `AsyncPipe` de Angular para manejar datos asincrónicos?

Manejar datos asincrónicos usando AsyncPipe:

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

import { Observable } from 'rxjs';



@Component({

  selector: 'app-async-pipe',

  template: \`<p>{{ data$ | async }}</p>\`

})

export class AsyncPipeComponent {

  data$: Observable<string> = new Observable(observer => {

    observer.next('Asynchronous Data');

    observer.complete();

  });

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a directivas o componentes secundarios?

Acceda a componentes secundarios o directivas usando @ViewChild:

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

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: \`<app-child></app-child>\`

})

export class ParentComponent {

  @ViewChild(ChildComponent) child: ChildComponent;



  ngAfterViewInit() {

    console.log(this.child.someProperty);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 10

1. ¿Cómo se utiliza `@ViewChild` de Angular para obtener una referencia a un elemento DOM?

Obtenga una referencia a un elemento DOM usando @ViewChild:

import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-view-child',

  template: \`<div #myDiv>Content</div>\`

})

export class ViewChildComponent implements AfterViewInit {

  @ViewChild('myDiv') div: ElementRef;



  ngAfterViewInit() {

    console.log(this.div.nativeElement.textContent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado?

Acceda al contenido proyectado usando @ContentChild:

import { Component, ContentChild, AfterContentInit, ElementRef } from '@angular/core';



@Component({

  selector: 'app-content-child',

  template: \`<ng-content></ng-content>\`

})

export class ContentChildComponent implements AfterContentInit {

  @ContentChild('projectedContent') content: ElementRef;



  ngAfterContentInit() {

    console.log(this.content.nativeElement.textContent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza `@Directive` de Angular para crear una directiva personalizada que cambia la apariencia de un elemento?

Cree una directiva personalizada usando @Directive:

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {}



  @HostListener('mouseenter') onMouseEnter() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

  }



  @HostListener('mouseleave') onMouseLeave() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'transparent');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `HttpClient` de Angular para realizar una solicitud POST con una carga útil JSON?

Realizar una solicitud POST usando HttpClient:

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

import { HttpClient } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable({

  providedIn: 'root'

})

export class ApiService {

  constructor(private http: HttpClient) {}



  postData(data: any): Observable<any> {

    return this.http.post('https://api.example.com/data', data);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza el `Router` de Angular para navegar con los parámetros de consulta?

Navegue con parámetros de consulta usando Router:

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

import { Router } from '@angular/router';



@Component({

  selector: 'app-query-params',

  template: \`<button (click)="navigate()">Navigate</button>\`

})

export class QueryParamsComponent {

  constructor(private router: Router) {}



  navigate() {

    this.router.navigate(['/path'], { queryParams: { page: 1, sort: 'asc' } });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `ActivatedRoute` de Angular para recuperar parámetros de consulta de la ruta?

Recuperar parámetros de consulta usando ActivatedRoute:

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

import { ActivatedRoute } from '@angular/router';



@Component({

  selector: 'app-query-params',

  template: \`<p>Page: {{ page }}, Sort: {{ sort }}</p>\`

})

export class QueryParamsComponent implements OnInit {

  page: number;

  sort: string;



  constructor(private route: ActivatedRoute) {}



  ngOnInit() {

    this.route.queryParams.subscribe(params => {

      this.page = +params['page'];

      this.sort = params['sort'];

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `ng-template` de Angular para crear plantillas condicionales?

Cree plantillas condicionales usando ng-template:

<ng-container *ngIf="isVisible; else noContent">

  <p>Content is visible</p>

</ng-container>



<ng-template #noContent>

  <p>Content is hidden</p>

</ng-template>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utilizan las directivas `ngIf` y `ngFor` de Angular juntas?

uso ngIf and ngFor together:

<div *ngIf="items.length > 0">

  <ul>

    <li *ngFor="let item de items">{{ item }}</li>

  </ul>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `NgSwitch` de Angular para mostrar contenido basado en el valor de una variable?

Mostrar contenido basado en una variable usando NgSwitch:

<div [ngSwitch]="value">

  <p *ngSwitchCase="'one'">One</p>

  <p *ngSwitchCase="'two'">Two</p>

  <p *ngSwitchDefault>Default</p>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `ngStyle` de Angular para aplicar estilos de forma condicional?

Aplicar estilos condicionalmente usando ngStyle:

<div [ngStyle]="{ 'background-color': isActive ? 'yellow' : 'transparent' }">

  Conditional Styling

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `ngClass` de Angular para agregar o eliminar clases dinámicamente?

Agregue o elimine clases dinámicamente usando ngClass:

<div [ngClass]="{ 'active': isActive, 'disabled': !isActive }">

  Dynamic Classes

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `FormControl` de Angular para administrar las entradas de formularios individuales?

Administre las entradas de formularios individuales usando FormControl:

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

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



@Component({

  selector: 'app-form-control',

  template: \`

    <input [formControl]="control" />

    <p>Value: {{ control.value }}</p>

  \`

})

export class FormControlComponent {

  control = new FormControl('');

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `FormBuilder` de Angular para crear un formulario con controles anidados?

Cree un formulario con controles anidados usando FormBuilder:

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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

  selector: 'app-nested-form',

  template: \`

    <form [formGroup]="form">

      <div formGroupName="address">

        <input formControlName="street" />

        <input formControlName="city" />

      </div>

    </form>

  \`

})

export class NestedFormComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      address: this.fb.group({

        street: '',

        city: ''

      })

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `FormGroup` de Angular para agrupar controles de formulario?

Controles de formulario de grupo usando FormGroup:

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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

  selector: 'app-form-group',

  template: \`

    <form [formGroup]="form">

      <input formControlName="name" />

      <input formControlName="email" />

    </form>

  \`

})

export class FormGroupComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      name: '',

      email: ''

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `AbstractControl` de Angular para trabajar con controles de formulario?

Trabajar con controles de formulario usando AbstractControl:

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

import { FormBuilder, FormGroup, AbstractControl } from '@angular/forms';



@Component({

  selector: 'app-abstract-control',

  template: \`

    <form [formGroup]="form">

      <input [formControl]="nameControl" />

    </form>

  \`

})

export class AbstractControlComponent {

  form: FormGroup;



  get nameControl(): AbstractControl {

    return this.form.get('name');

  }



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      name: ''

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utilizan los `Validadores personalizados` de Angular para validar los controles de formulario?

Cree validadores personalizados para controles de formulario:

import { AbstractControl, ValidatorFn } from '@angular/forms';



export function forbiddenNameValidator(name: string): ValidatorFn {

  return (control: AbstractControl): { [key: string]: any } | null => {

    const forbidden = control.value === name;

    return forbidden ? { 'forbiddenName': { value: control.value } } : null;

  };

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

Activar manualmente la detección de cambios usando ChangeDetectorRef:

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



@Component({

  selector: 'app-manual-detection',

  template: \`<p>Manual Detection</p>\`

})

export class ManualDetectionComponent {

  constructor(private cdr: ChangeDetectorRef) {}



  triggerChangeDetection() {

    this.cdr.detectChanges();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza la estrategia de detección de cambios `OnPush` de Angular para optimizar el rendimiento?

Optimice el rendimiento utilizando OnPush change detection strategy:

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



@Component({

  selector: 'app-on-push',

  template: \`<p>OnPush Strategy</p>\`,

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class OnPushComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utilizan los "Componentes dinámicos" de Angular para cargar componentes dinámicamente?

Cargue componentes dinámicamente usando ComponentFactoryResolver:

import { Component, ComponentFactoryResolver, ViewContainerRef, OnInit } from '@angular/core';



@Component({

  selector: 'app-dynamic',

  template: \`<ng-container #container></ng-container>\`

})

export class DynamicComponent implements OnInit {

  constructor(private cfr: ComponentFactoryResolver, private vcr: ViewContainerRef) {}



  ngOnInit() {

    const factory = this.cfr.resolveComponentFactory(SomeComponent);

    this.vcr.createComponent(factory);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `NgModule` de Angular para configurar un módulo de funciones con carga diferida?

Configure un módulo de funciones con carga diferida usando NgModule:

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

import { RouterModule, Routes } from '@angular/router';

import { FeatureComponent } from './feature.component';



const routes: Routes = [

  { path: '', component: FeatureComponent }

];



@NgModule({

  imports: [RouterModule.forChild(routes)],

  exports: [RouterModule]

})

export class FeatureModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 11

1. ¿Cómo se utiliza `Renderer2` de Angular para manipular el DOM de forma segura?

Manipular el DOM usando Renderer2:

import { Component, Renderer2, ElementRef } from '@angular/core';



@Component({

  selector: 'app-renderer',

  template: \`<div #myDiv>Content</div>\`

})

export class RendererComponent {

  constructor(private renderer: Renderer2, private el: ElementRef) {}



  changeBackgroundColor() {

    this.renderer.setStyle(this.el.nativeElement.querySelector('div'), 'backgroundColor', 'blue');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `HttpInterceptor` de Angular para manejar solicitudes y respuestas HTTP globalmente?

Manejar solicitudes y respuestas HTTP usando HttpInterceptor:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class TokenInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const clonedRequest = req.clone({

      headers: req.headers.set('Authorization', 'Bearer your-token')

    });

    return next.handle(clonedRequest);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza la "Inyección de dependencia" de Angular para proporcionar servicios en un inyector jerárquico?

Proporcionar servicios utilizando inyectores jerárquicos:

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



@Injectable({

  providedIn: 'root' // Service provided at root level

})

export class SharedService {

  constructor() {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza el `Router` de Angular para implementar protectores de ruta para la autenticación?

Implementar protectores de ruta para la autenticación utilizando Router:

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

import { CanActivate, Router } from '@angular/router';

import { Observable } from 'rxjs';



@Injectable({

  providedIn: 'root'

})

export class AuthGuard implements CanActivate {

  constructor(private router: Router) {}



  canActivate(): Observable<boolean> | Promise<boolean> | boolean {

    const isAuthenticated = false; // Replace with real authentication check

    if (!isAuthenticated) {

      this.router.navigate(['/login']);

      return false;

    }

    return true;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para comprobar manualmente si hay cambios en un componente?

Verifique manualmente los cambios usando ChangeDetectorRef:

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



@Component({

  selector: 'app-detection',

  template: \`<p>Manual Change Detection</p>\`

})

export class DetectionComponent {

  constructor(private cdr: ChangeDetectorRef) {}



  triggerCheck() {

    this.cdr.detectChanges();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `NgZone` de Angular para ejecutar código fuera de la zona Angular?

Ejecute código fuera de la zona angular usando NgZone:

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



@Component({

  selector: 'app-ng-zone',

  template: \`<p>NgZone Example</p>\`

})

export class NgZoneComponent {

  constructor(private ngZone: NgZone) {}



  runOutsideAngular() {

    this.ngZone.runOutsideAngular(() => {

      // Code here won't trigger Angular change detection

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza el decorador `@Inject` de Angular para inyectar dependencias?

Inyectar dependencias usando @Inject:

import { Injectable, Inject } from '@angular/core';



const TOKEN = 'my-token';



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Inject(TOKEN) private token: string) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza el decorador `@HostListener` de Angular para escuchar eventos DOM?

Escuche eventos DOM usando @HostListener:

import { Directive, HostListener } from '@angular/core';



@Directive({

  selector: '[appHostListener]'

})

export class HostListenerDirective {

  @HostListener('click', ['$event'])

  onClick(event: Event) {

    console.log('Element clicked', event);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza el decorador `@HostBinding` de Angular para vincular propiedades al elemento host?

Vincular propiedades al elemento host usando @HostBinding:

import { Directive, HostBinding } from '@angular/core';



@Directive({

  selector: '[appHostBinding]'

})

export class HostBindingDirective {

  @HostBinding('attr.aria-label') ariaLabel = 'Host Element';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza el `ng-container` de Angular para evitar agregar elementos adicionales al DOM?

uso ng-container to avoid adding extra elements:

<ng-container *ngIf="isVisible">

  <p>This will be displayed if isVisible is true</p>

</ng-container>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@ViewChildren` de Angular para obtener referencias a múltiples elementos DOM?

Obtenga referencias a múltiples elementos DOM usando @ViewChildren:

import { Component, QueryList, ViewChildren, ElementRef, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-view-children',

  template: \`<div #item *ngFor="let i de items">Item {{ i }}</div>\`

})

export class ViewChildrenComponent implements AfterViewInit {

  @ViewChildren('item') items: QueryList<ElementRef>;



  ngAfterViewInit() {

    this.items.forEach(item => console.log(item.nativeElement.textContent));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@ContentChildren` de Angular para obtener referencias a múltiples elementos de contenido proyectados?

Obtenga referencias a múltiples elementos de contenido proyectados usando @ContentChildren:

import { Component, ContentChildren, QueryList, AfterContentInit, ElementRef } from '@angular/core';



@Component({

  selector: 'app-content-children',

  template: \`<ng-content></ng-content>\`

})

export class ContentChildrenComponent implements AfterContentInit {

  @ContentChildren('contentItem') contentItems: QueryList<ElementRef>;



  ngAfterContentInit() {

    this.contentItems.forEach(item => console.log(item.nativeElement.textContent));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular para pasar datos entre componentes?

Pasar datos entre componentes usando @Input and @Output:

import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

  selector: 'app-child',

  template: \`<button (click)="sendMessage()">Send</button>\`

})

export class ChildComponent {

  @Input() parentData: string;

  @Output() messageEvent = new EventEmitter<string>();



  sendMessage() {

    this.messageEvent.emit('Message from child');

  }

}



@Component({

  selector: 'app-parent',

  template: \`

    <app-child [parentData]="data" (messageEvent)="receiveMessage($event)"></app-child>

  \`

})

export class ParentComponent {

  data = 'Data from parent';



  receiveMessage(message: string) {

    console.log(message);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `@ViewChild` de Angular para obtener una referencia a un componente secundario o elemento DOM?

Obtenga una referencia a un componente secundario o elemento DOM usando @ViewChild:

import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-view-child',

  template: \`<div #myDiv>Child Div</div>\`

})

export class ViewChildComponent implements AfterViewInit {

  @ViewChild('myDiv') myDiv: ElementRef;



  ngAfterViewInit() {

    console.log(this.myDiv.nativeElement.textContent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular para gestionar el comportamiento de detección de cambios?

Gestione el comportamiento de detección de cambios utilizando ChangeDetectionStrategy:

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



@Component({

  selector: 'app-change-detection',

  template: \`<p>Change Detection Strategy</p>\`,

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class ChangeDetectionComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utilizan las directivas `ngIf` y `ngFor` de Angular para mostrar e iterar elementos condicionalmente?

uso ngIf and ngFor directives to conditionally display and iterate over elements:

<div *ngIf="isVisible">

  <div *ngFor="let item de items">{{ item }}</div>

</div>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `ng-template` de Angular para definir bloques de plantilla reutilizables?

Defina bloques de plantilla reutilizables usando ng-template:

<ng-template #myTemplate>

  <p>Reusable Content</p>

</ng-template>



<ng-container *ngTemplateOutlet="myTemplate"></ng-container>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `ContentProjection` de Angular para proyectar contenido en un componente?

Proyectar contenido en un componente usando ContentProjection:

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



@Component({

  selector: 'app-content-projection',

  template: \`

    <ng-content></ng-content>

  \`

})

export class ContentProjectionComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza la "Inyección de dependencia" de Angular para proporcionar diferentes instancias de un servicio?

Proporcionar diferentes instancias de un servicio utilizando Dependency Injection:

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



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor() {}

}



@Injectable({

  providedIn: 'root',

  useClass: DifferentService

})

export class AlternativeService {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza el `Router` de Angular para manejar rutas secundarias?

Manejar rutas secundarias usando Router:

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

import { RouterModule, Routes } from '@angular/router';

import { ParentComponent } from './parent.component';

import { ChildComponent } from './child.component';



const routes: Routes = [

  {

    path: 'parent',

    component: ParentComponent,

    children: [

      { path: 'child', component: ChildComponent }

    ]

  }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 12

1. ¿Cómo se utiliza `NgModule` de Angular para configurar módulos de carga diferida?

Configure módulos de carga diferida usando NgModule:

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

import { RouterModule, Routes } from '@angular/router';

import { CommonModule } from '@angular/common';

import { LazyModule } from './lazy/lazy.module';



const routes: Routes = [

  {

    path: 'lazy',

    loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule)

  }

];



@NgModule({

  imports: [RouterModule.forRoot(routes), CommonModule],

  exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `@ViewEncapsulation` de Angular para controlar la encapsulación de estilos?

Controle la encapsulación del estilo usando @ViewEncapsulation:

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



@Component({

  selector: 'app-encapsulation',

  template: \`<p>Style Encapsulation</p>\`,

  styles: [\`

    p { color: blue; }

  \`],

  encapsulation: ViewEncapsulation.None // No encapsulation

})

export class EncapsulationComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza `NgModule` de Angular para importar y utilizar bibliotecas de terceros?

Importar y utilizar bibliotecas de terceros en NgModule:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; // Example third-party library



@NgModule({

  declarations: [AppComponent],

  imports: [

    BrowserModule,

    NgbModule // Import third-party module

  ],

  providers: [],

  bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP y manejar respuestas?

Realice solicitudes HTTP y maneje respuestas usando HttpClient:

import { HttpClient } from '@angular/common/http';

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

import { Observable } from 'rxjs';



@Injectable({

  providedIn: 'root'

})

export class ApiService {

  constructor(private http: HttpClient) {}



  getData(): Observable<any> {

    return this.http.get('https://api.example.com/data');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `FormArray` de Angular para gestionar formularios dinámicos?

Administrar formularios dinámicos usando FormArray:

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

import { FormBuilder, FormGroup, FormArray } from '@angular/forms';



@Component({

  selector: 'app-dynamic-form',

  template: \`

    <form [formGroup]="form">

      <div formArrayName="items">

        <div *ngFor="let item de items.controls; let i = index">

          <input [formControlName]="i">

        </div>

      </div>

    </form>

    <button (click)="addItem()">Add Item</button>

  \`

})

export class DynamicFormComponent {

  form: FormGroup;



  get items(): FormArray {

    return this.form.get('items') as FormArray;

  }



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      items: this.fb.array([])

    });

  }



  addItem() {

    this.items.push(this.fb.control(''));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza el decorador `@Pipe` de Angular para crear tuberías personalizadas?

Crea tuberías personalizadas usando @Pipe:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'customPipe'

})

export class CustomPipe implements PipeTransform {

  transform(value: string): string {

    return value.toUpperCase();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

Activar la detección de cambios manualmente usando ChangeDetectorRef:

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



@Component({

  selector: 'app-change-detection',

  template: \`<p>Change Detection</p>\`

})

export class ChangeDetectionComponent {

  constructor(private cdr: ChangeDetectorRef) {}



  updateView() {

    this.cdr.detectChanges(); // Manually trigger change detection

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza `@HostListener` de Angular para escuchar los eventos del elemento host?

Escuche los eventos del elemento anfitrión usando @HostListener:

import { Directive, HostListener } from '@angular/core';



@Directive({

  selector: '[appHostListener]'

})

export class HostListenerDirective {

  @HostListener('click', ['$event'])

  onClick(event: Event) {

    console.log('Host element clicked:', event);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `@ViewChild` de Angular para obtener una referencia a un componente secundario?

Obtenga una referencia a un componente secundario usando @ViewChild:

import { Component, ViewChild, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: \`<app-child></app-child>\`

})

export class ParentComponent implements AfterViewInit {

  @ViewChild(ChildComponent) childComponent: ChildComponent;



  ngAfterViewInit() {

    console.log(this.childComponent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `@ContentChildren` de Angular para obtener referencias a múltiples elementos de contenido proyectados?

Obtenga referencias a múltiples elementos de contenido proyectados usando @ContentChildren:

import { Component, ContentChildren, QueryList, AfterContentInit } from '@angular/core';



@Component({

  selector: 'app-content',

  template: \`

    <ng-content></ng-content>

  \`

})

export class ContentComponent implements AfterContentInit {

  @ContentChildren('contentItem') contentItems: QueryList<ElementRef>;



  ngAfterContentInit() {

    this.contentItems.forEach(item => console.log(item.nativeElement.textContent));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `NgZone` de Angular para ejecutar código fuera de la detección de cambios de Angular?

Ejecute código fuera de la detección de cambios de Angular usando NgZone:

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



@Component({

  selector: 'app-ng-zone',

  template: \`<p>NgZone Example</p>\`

})

export class NgZoneComponent {

  constructor(private ngZone: NgZone) {

    this.ngZone.runOutsideAngular(() => {

      // Code here runs outside Angular's change detection

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza el decorador `@Inject` de Angular para inyectar servicios con diferentes configuraciones?

Inyecte servicios con diferentes configuraciones usando @Inject:

import { Injectable, Inject } from '@angular/core';

import { APP_CONFIG, AppConfig } from './app-config';



@Injectable({

  providedIn: 'root'

})

export class ConfigService {

  constructor(@Inject(APP_CONFIG) private config: AppConfig) {}



  getConfig() {

    return this.config;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza el `Router` de Angular para manejar los guardias de ruta para proteger rutas?

Maneje los guardias de ruta usando Router:

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

import { CanActivate, Router } from '@angular/router';



@Injectable({

  providedIn: 'root'

})

export class AuthGuard implements CanActivate {

  constructor(private router: Router) {}



  canActivate(): boolean {

    const isAuthenticated = false; // Replace with actual authentication check

    if (!isAuthenticated) {

      this.router.navigate(['/login']);

      return false;

    }

    return true;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `Renderer2` de Angular para manipular elementos DOM de forma segura?

Manipular elementos DOM de forma segura utilizando Renderer2:

import { Component, Renderer2, ElementRef, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-renderer',

  template: \`<div #myDiv>Content</div>\`

})

export class RendererComponent implements AfterViewInit {

  constructor(private renderer: Renderer2, private el: ElementRef) {}



  ngAfterViewInit() {

    const div = this.el.nativeElement.querySelector('div');

    this.renderer.setStyle(div, 'color', 'red');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `HttpInterceptor` de Angular para modificar solicitudes y respuestas HTTP?

Modifique las solicitudes y respuestas HTTP usando HttpInterceptor:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';

import { Observable } from 'rxjs';



@Injectable()

export class AuthInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const clonedRequest = req.clone({

      setHeaders: {

        Authorization: 'Bearer your-token'

      }

    });

    return next.handle(clonedRequest);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `Renderer2` de Angular para escuchar eventos DOM?

Escuche eventos DOM usando Renderer2:

import { Component, Renderer2, ElementRef, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-event-listener',

  template: \`<button #myButton>Click me</button>\`

})

export class EventListenerComponent implements AfterViewInit {

  constructor(private renderer: Renderer2, private el: ElementRef) {}



  ngAfterViewInit() {

    const button = this.el.nativeElement.querySelector('button');

    this.renderer.listen(button, 'click', () => {

      console.log('Button clicked!');

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `HttpClient` de Angular para manejar la carga de archivos?

Manejar la carga de archivos usando HttpClient:

import { HttpClient } from '@angular/common/http';

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

import { Observable } from 'rxjs';



@Injectable({

  providedIn: 'root'

})

export class FileUploadService {

  constructor(private http: HttpClient) {}



  uploadFile(file: File): Observable<any> {

    const formData = new FormData();

    formData.append('file', file);

    return this.http.post('https://api.example.com/upload', formData);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `@HostBinding` de Angular para vincular propiedades a elementos host?

Vincular propiedades a elementos host usando @HostBinding:

import { Directive, HostBinding } from '@angular/core';



@Directive({

  selector: '[appHostBinding]'

})

export class HostBindingDirective {

  @HostBinding('attr.role') role = 'button';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@ContentChildren` de Angular para obtener referencias al contenido proyectado en un componente principal?

Obtenga referencias al contenido proyectado usando @ContentChildren:

import { Component, ContentChildren, QueryList, AfterContentInit } from '@angular/core';



@Component({

  selector: 'app-content',

  template: \`

    <ng-content select="[contentItem]" *ngFor="let item de contentItems"></ng-content>

  \`

})

export class ContentComponent implements AfterContentInit {

  @ContentChildren('contentItem') contentItems: QueryList<ElementRef>;



  ngAfterContentInit() {

    this.contentItems.forEach(item => console.log(item.nativeElement.textContent));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `Renderer2` de Angular para agregar y eliminar clases CSS de forma condicional?

Agregar y eliminar clases CSS condicionalmente usando Renderer2:

import { Component, Renderer2, ElementRef, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-css-class',

  template: \`<div #myDiv>Content</div>\`

})

export class CssClassComponent implements AfterViewInit {

  constructor(private renderer: Renderer2, private el: ElementRef) {}



  ngAfterViewInit() {

    const div = this.el.nativeElement.querySelector('div');

    this.renderer.addClass(div, 'active');

    this.renderer.removeClass(div, 'inactive');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 13

1. ¿Cómo se utilizan los operadores `RxJS` de Angular para manejar operaciones asincrónicas?

Manejar operaciones asincrónicas usando RxJS operators:

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

import { de } from 'rxjs';

import { delay, map } from 'rxjs/operators';



@Component({

  selector: 'app-rxjs',

  template: \`<p>Check console for RxJS example</p>\`

})

export class RxjsComponent {

  constructor() {

    of('Hello, World!')

      .pipe(

        delay(1000),

        map(message => message.toUpperCase())

      )

      .subscribe(result => console.log(result));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular para pasar datos entre componentes?

Pasar datos entre componentes usando @Input and @Output:

import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

  selector: 'app-child',

  template: \`

    <button (click)="notifyParent()">Notify Parent</button>

  \`

})

export class ChildComponent {

  @Input() childData: string;

  @Output() notify: EventEmitter<string> = new EventEmitter<string>();



  notifyParent() {

    this.notify.emit('Hello from Child');

  }

}



@Component({

  selector: 'app-parent',

  template: \`

    <app-child [childData]="parentData" (notify)="onNotify($event)"></app-child>

  \`

})

export class ParentComponent {

  parentData = 'Data from Parent';



  onNotify(message: string) {

    console.log(message);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza el `Router` de Angular para implementar el manejo de parámetros de ruta y de consulta?

Implementar el manejo de parámetros de ruta y consulta usando Router:

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

import { ActivatedRoute } from '@angular/router';



@Component({

  selector: 'app-details',

  template: \`<p>ID: {{ id }} | Filter: {{ filter }}</p>\`

})

export class DetailsComponent implements OnInit {

  id: string;

  filter: string;



  constructor(private route: ActivatedRoute) {}



  ngOnInit() {

    this.route.paramMap.subscribe(params => {

      this.id = params.get('id');

    });

    this.route.queryParamMap.subscribe(queryParams => {

      this.filter = queryParams.get('filter');

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `Renderer2` de Angular para interactuar de forma segura con el DOM?

Interactuar con el DOM de forma segura usando Renderer2:

import { Component, Renderer2, ElementRef, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-renderer',

  template: \`<div #myDiv>Content</div>\`

})

export class RendererComponent implements AfterViewInit {

  constructor(private renderer: Renderer2, private el: ElementRef) {}



  ngAfterViewInit() {

    const div = this.el.nativeElement.querySelector('div');

    this.renderer.setStyle(div, 'color', 'green');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular para optimizar la detección de cambios?

Optimice la detección de cambios usando ChangeDetectionStrategy:

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



@Component({

  selector: 'app-optimization',

  template: \`<p>Optimized Change Detection</p>\`,

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class OptimizationComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `DynamicComponentLoader` de Angular para cargar componentes dinámicamente?

Cargue componentes dinámicamente usando ComponentFactoryResolver:

import { Component, ComponentFactoryResolver, ViewChild, ViewContainerRef, OnInit } from '@angular/core';

import { DynamicComponent } from './dynamic.component';



@Component({

  selector: 'app-dynamic',

  template: \`<ng-template #dynamicContainer></ng-template>\`

})

export class DynamicComponentLoader implements OnInit {

  @ViewChild('dynamicContainer', { read: ViewContainerRef }) container: ViewContainerRef;



  constructor(private resolver: ComponentFactoryResolver) {}



  ngOnInit() {

    const factory = this.resolver.resolveComponentFactory(DynamicComponent);

    this.container.createComponent(factory);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza la "Inyección de dependencia" de Angular para proporcionar servicios en un módulo?

Proporcionar servicios en un módulo utilizando Dependency Injection:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { ApiService } from './api.service';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [ApiService], // Provide service in module

  bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza el `Router` de Angular para implementar rutas anidadas?

Implementar rutas anidadas usando Router:

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

import { RouterModule, Routes } from '@angular/router';

import { ParentComponent } from './parent.component';

import { ChildComponent } from './child.component';



const routes: Routes = [

  {

    path: 'parent',

    component: ParentComponent,

    children: [

      { path: 'child', component: ChildComponent }

    ]

  }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `@NgModule` de Angular para configurar proveedores para diferentes entornos?

Configurar proveedores para diferentes entornos en NgModule:

import { NgModule, APP_INITIALIZER } from '@angular/core';

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { environment } from '../environments/environment';



export function initializeApp() {

  return (): Promise<any> => {

    // Initialize app based on environment

    return new Promise((resolve, reject) => {

      // Initialization logic here

      resolve(true);

    });

  };

}



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [

    { provide: APP_INITIALIZER, useFactory: initializeApp, multi: true }

  ],

  bootstrap: [AppComponent]

})

export class AppModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza el decorador `@Injectable` de Angular para crear servicios con diferentes alcances?

Cree servicios con diferentes alcances usando @Injectable:

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



@Injectable({

  providedIn: 'root' // Singleton service

})

export class SingletonService {}



@Injectable({

  providedIn: 'any' // Scoped service

})

export class ScopedService {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a componentes secundarios o elementos DOM?

Acceda a componentes secundarios o elementos DOM usando @ViewChild:

import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';



@Component({

  selector: 'app-view-child',

  template: \`<div #myDiv>Content</div>\`

})

export class ViewChildComponent implements AfterViewInit {

  @ViewChild('myDiv') myDiv: ElementRef;



  ngAfterViewInit() {

    console.log(this.myDiv.nativeElement.textContent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado en un componente?

Acceda al contenido proyectado usando @ContentChild:

import { Component, ContentChild, ElementRef, AfterContentInit } from '@angular/core';



@Component({

  selector: 'app-content-child',

  template: \`<ng-content></ng-content>\`

})

export class ContentChildComponent implements AfterContentInit {

  @ContentChild('content') content: ElementRef;



  ngAfterContentInit() {

    console.log(this.content.nativeElement.textContent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

Activar la detección de cambios manualmente usando ChangeDetectorRef:

import { Component, ChangeDetectorRef, OnInit } from '@angular/core';



@Component({

  selector: 'app-change-detector',

  template: \`<p>Manual Change Detection</p>\`

})

export class ChangeDetectorComponent implements OnInit {

  constructor(private cdRef: ChangeDetectorRef) {}



  ngOnInit() {

    this.cdRef.detectChanges(); // Manually trigger change detection

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `FormBuilder` de Angular para crear formularios reactivos?

Crea formularios reactivos usando FormBuilder:

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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

  selector: 'app-reactive-form',

  template: \`

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

      <input formControlName="name" />

      <button type="submit">Submit</button>

    </form>

  \`

})

export class ReactiveFormComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      name: ['']

    });

  }



  onSubmit() {

    console.log(this.form.value);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `HttpClient` de Angular para manejar las descargas de archivos?

Manejar descargas de archivos usando HttpClient:

import { HttpClient } from '@angular/common/http';

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

import { Observable } from 'rxjs';

import { saveAs } from 'file-saver';



@Injectable({

  providedIn: 'root'

})

export class FileDownloadService {

  constructor(private http: HttpClient) {}



  downloadFile(): Observable<Blob> {

    return this.http.get('https://api.example.com/download', { responseType: 'blob' });

  }



  saveFile() {

    this.downloadFile().subscribe(blob => {

      saveAs(blob, 'filename.ext');

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `NgModule` de Angular para configurar módulos de carga diferida?

Configure módulos de carga diferida usando NgModule:

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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';



const routes: Routes = [

  { path: '', component: HomeComponent },

  { path: 'lazy', loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza el `Observable` de Angular para implementar actualizaciones de datos en tiempo real?

Implemente actualizaciones de datos en tiempo real utilizando Observable:

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

import { WebSocketSubject } from 'rxjs/webSocket';



@Component({

  selector: 'app-real-time',

  template: \`<p>Real-time Data: {{ data }}</p>\`

})

export class RealTimeComponent implements OnInit {

  data: any;

  private socket$: WebSocketSubject<any>;



  ngOnInit() {

    this.socket$ = new WebSocketSubject('wss://api.example.com/socket');

    this.socket$.subscribe(message => {

      this.data = message;

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `NgZone` de Angular para optimizar el rendimiento en cálculos pesados?

Optimice el rendimiento utilizando NgZone:

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



@Component({

  selector: 'app-ng-zone',

  template: \`<p>NgZone Performance Optimization</p>\`

})

export class NgZoneComponent {

  constructor(private ngZone: NgZone) {

    this.ngZone.runOutsideAngular(() => {

      // Perform heavy computations here

      setTimeout(() => {

        console.log('Heavy computation done');

        this.ngZone.run(() => {

          // Update UI if needed

        });

      }, 1000);

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza el decorador `@Injectable` de Angular para crear servicios multiproveedor?

Cree servicios multiproveedor utilizando @Injectable:

import { Injectable, InjectionToken } from '@angular/core';



export const API_URL = new InjectionToken<string>('apiUrl');



@Injectable({

  providedIn: 'root'

})

export class ApiService {

  constructor(@Inject(API_URL) private apiUrl: string) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para manejar problemas de rendimiento en aplicaciones grandes?

Maneje los problemas de rendimiento usando ChangeDetectorRef:

import { Component, ChangeDetectorRef, OnInit } from '@angular/core';



@Component({

  selector: 'app-performance',

  template: \`<p>Performance Optimized</p>\`

})

export class PerformanceComponent implements OnInit {

  constructor(private cdRef: ChangeDetectorRef) {}



  ngOnInit() {

    this.cdRef.detach(); // Detach change detection

    // Perform operations without triggering change detection

    this.cdRef.reattach(); // Reattach change detection if needed

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 14

1. ¿Cómo se crea una tubería angular personalizada?

Para crear una tubería personalizada, utilice el @Pipe decorator and implement the PipeTransform interface:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'customPipe'

})

export class CustomPipe implements PipeTransform {

  transform(value: string, ...args: any[]): string {

    return value.toUpperCase(); // Example transformation

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `ng-content` de Angular para proyectar contenido en un componente?

uso ng-content to project content into a component:

<!-- Parent component template -->

<app-child>

  <p>This content is projected into the child component</p>

</app-child>



<!-- Child component template -->

<ng-content></ng-content>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se implementa un control de formulario personalizado en Angular?

Para implementar un control de formulario personalizado, implemente ControlValueAccessor:

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

import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';



@Component({

  selector: 'app-custom-input',

  template: '<input (input)="onChange($event.target.value)" [value]="value">',

  providers: [{

    provide: NG_VALUE_ACCESSOR,

    useExisting: forwardRef(() => CustomInputComponent),

    multi: true

  }]

})

export class CustomInputComponent implements ControlValueAccessor {

  value: string = '';

  onChange = (value: string) => {};

  onTouched = () => {};



  writeValue(value: string): void {

    this.value = value;

  }



  registerOnChange(fn: (value: string) => void): void {

    this.onChange = fn;

  }



  registerOnTouched(fn: () => void): void {

    this.onTouched = fn;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza la inyección de dependencia de Angular para proporcionar servicios?

Proporcione servicios utilizando la inyección de dependencia de Angular:

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



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor() { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se manejan los errores en los servicios Angular usando `HttpInterceptor`?

Manejar errores usando HttpInterceptor:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http';

import { catchError, Observable, throwError } from 'rxjs';



@Injectable()

export class ErrorInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return next.handle(req).pipe(

      catchError((error: HttpErrorResponse) => {

        console.error('Error occurred:', error);

        return throwError(error);

      })

    );

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se crea un módulo Angular con rutas cargadas de forma diferida?

Cree un módulo con rutas cargadas de forma diferida usando RouterModule.forChild:

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

import { RouterModule, Routes } from '@angular/router';

import { FeatureComponent } from './feature.component';



const routes: Routes = [

  { path: '', component: FeatureComponent }

];



@NgModule({

  imports: [RouterModule.forChild(routes)],

  exports: [RouterModule]

})

export class FeatureRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza el decorador `@HostListener` de Angular para escuchar eventos DOM?

uso @HostListener to listen to DOM events:

import { Directive, HostListener } from '@angular/core';



@Directive({

  selector: '[appHover]'

})

export class HoverDirective {

  @HostListener('mouseover') onMouseOver() {

    console.log('Mouse over event');

  }



  @HostListener('mouseout') onMouseOut() {

    console.log('Mouse out event');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se implementa la `ChangeDetectionStrategy` de Angular?

implementar ChangeDetectionStrategy to optimize change detection:

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



@Component({

  selector: 'app-optimized',

  template: '<p>Optimized Component</p>',

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class OptimizedComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza el decorador `@Injectable` de Angular con diferentes proveedores?

uso @Injectable with different providers:

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

import { HttpClient } from '@angular/common/http';



@Injectable({

  providedIn: 'root' // Singleton service

})

export class DataService {

  constructor(private http: HttpClient) { }



  getData() {

    return this.http.get('/api/data');

  }

}



@Injectable()

export class OtherService {

  constructor() { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se manejan las dependencias de los módulos Angular y los módulos de funciones?

Manejar dependencias de módulos y módulos de funciones:

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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';



@NgModule({

  declarations: [FeatureComponent],

  imports: [CommonModule],

  exports: [FeatureComponent]

})

export class FeatureModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `Renderer2` de Angular para manipular elementos DOM de forma segura?

Manipular elementos DOM de forma segura utilizando Renderer2:

import { Component, Renderer2, ElementRef } from '@angular/core';



@Component({

  selector: 'app-dom-manipulation',

  template: '<div #myDiv>Content</div>'

})

export class DomManipulationComponent {

  constructor(private renderer: Renderer2, private el: ElementRef) {}



  changeStyle() {

    const div = this.el.nativeElement.querySelector('#myDiv');

    this.renderer.setStyle(div, 'color', 'blue');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a directivas y componentes secundarios?

Acceda a componentes secundarios y directivas usando @ViewChild:

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

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: '<app-child></app-child>'

})

export class ParentComponent {

  @ViewChild(ChildComponent) child!: ChildComponent;



  callChildMethod() {

    this.child.someMethod();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado?

Acceda al contenido proyectado usando @ContentChild:

import { Component, ContentChild, AfterContentInit } from '@angular/core';

import { ChildDirective } from './child.directive';



@Component({

  selector: 'app-parent',

  template: '<ng-content></ng-content>'

})

export class ParentComponent implements AfterContentInit {

  @ContentChild(ChildDirective) contentChild!: ChildDirective;



  ngAfterContentInit() {

    console.log(this.contentChild);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `@HostBinding` de Angular para vincular propiedades a elementos host?

Vincular propiedades a elementos host usando @HostBinding:

import { Directive, HostBinding } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  @HostBinding('class.highlight') isHighlighted = true;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se crea un servicio Angular con múltiples instancias?

Cree un servicio con múltiples instancias usando providers in component metadata:

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

import { MyService } from './my.service';



@Component({

  selector: 'app-example',

  template: '<p>Example Component</p>',

  providers: [MyService] // New instance for this component

})

export class ExampleComponent {

  constructor(private myService: MyService) { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

Activar la detección de cambios manualmente usando ChangeDetectorRef:

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



@Component({

  selector: 'app-manual-detection',

  template: '<p>Manual Change Detection</p>'

})

export class ManualDetectionComponent {

  constructor(private cdr: ChangeDetectorRef) { }



  triggerChangeDetection() {

    this.cdr.detectChanges();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `ng-template` de Angular para crear plantillas reutilizables?

Cree plantillas reutilizables usando ng-template:

<ng-template #template>

  <p>Reusable content</p>

</ng-template>



<ng-container *ngTemplateOutlet="template"></ng-container>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `@NgModule` de Angular para configurar las importaciones y exportaciones de módulos?

Configurar importaciones y exportaciones en @NgModule:

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

import { CommonModule } from '@angular/common';

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



@NgModule({

  imports: [

    CommonModule,

    FormsModule

  ],

  exports: [

    CommonModule,

    FormsModule

  ]

})

export class SharedModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@Inject` de Angular para proporcionar dependencias?

Proporcionar dependencias usando @Inject:

import { Injectable, Inject } from '@angular/core';



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Inject('API_URL') private apiUrl: string) { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se crean decoradores personalizados de Angular para componentes y servicios?

Cree decoradores personalizados definiendo funciones que devuelvan metadatos:

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



function CustomDecorator(config: any) {

  return function (target: Function) {

    // Custom logic here

    console.log('Decorator applied with config:', config);

  };

}



@CustomDecorator({ key: 'value' })

@Component({

  selector: 'app-decorated',

  template: '<p>Custom Decorator Component</p>'

})

export class DecoratedComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 15

1. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos personalizados?

Escuche eventos personalizados usando @HostListener:

import { Directive, HostListener } from '@angular/core';



@Directive({

  selector: '[appCustomEvent]'

})

export class CustomEventDirective {

  @HostListener('customEvent', ['$event'])

  onCustomEvent(event: Event) {

    console.log('Custom event fired', event);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `@ViewChildren` de Angular para acceder a múltiples componentes secundarios?

Acceda a múltiples componentes secundarios usando @ViewChildren:

import { Component, ViewChildren, QueryList } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: '<app-child *ngFor="let child de children"></app-child>'

})

export class ParentComponent {

  @ViewChildren(ChildComponent) children!: QueryList<ChildComponent>;



  ngAfterViewInit() {

    this.children.forEach(child => child.someMethod());

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza `@ContentChildren` de Angular para acceder a múltiples elementos de contenido proyectados?

Acceda a múltiples elementos de contenido proyectados usando @ContentChildren:

import { Component, ContentChildren, QueryList, AfterContentInit } from '@angular/core';

import { ProjectedComponent } from './projected.component';



@Component({

  selector: 'app-container',

  template: '<ng-content></ng-content>'

})

export class ContainerComponent implements AfterContentInit {

  @ContentChildren(ProjectedComponent) projectedItems!: QueryList<ProjectedComponent>;



  ngAfterContentInit() {

    this.projectedItems.forEach(item => item.doSomething());

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se manejan los eventos del enrutador de Angular para implementar protectores de navegación?

Implementar guardias de navegación usando Router events:

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

import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';



@Injectable({

  providedIn: 'root'

})

export class AuthGuard implements CanActivate {

  constructor(private router: Router) {}



  canActivate(

    next: ActivatedRouteSnapshot,

    state: RouterStateSnapshot

  ): boolean {

    const isAuthenticated = false; // Logic to check authentication

    if (!isAuthenticated) {

      this.router.navigate(['/login']);

      return false;

    }

    return true;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se crea un validador Angular personalizado para controles de formulario?

Cree una función de validación personalizada:

import { AbstractControl, ValidatorFn } from '@angular/forms';



export function customValidator(): ValidatorFn {

  return (control: AbstractControl): { [key: string]: any } | null => {

    const isValid = /* custom validation logic */;

    return isValid ? null : { 'customError': true };

  };

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `@Injectable` de Angular para inyectar tokens y valores de configuración?

Inyecte tokens y valores de configuración usando @Inject:

import { Injectable, Inject } from '@angular/core';



@Injectable({

  providedIn: 'root'

})

export class ConfigService {

  constructor(@Inject('APP_CONFIG') private config: any) { }



  getConfig() {

    return this.config;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza el decorador `@Pipe` de Angular para crear una tubería personalizada?

Cree una tubería personalizada usando @Pipe:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'reverse'

})

export class ReversePipe implements PipeTransform {

  transform(value: string): string {

    return value.split('').reverse().join('');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza el `Router` de Angular para navegar mediante programación entre rutas?

Navegar programáticamente usando Router:

import { Router } from '@angular/router';



constructor(private router: Router) {}



navigateToHome() {

  this.router.navigate(['/home']);

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP y manejar respuestas?

Realizar solicitudes HTTP utilizando HttpClient:

import { HttpClient } from '@angular/common/http';

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



@Injectable({

  providedIn: 'root'

})

export class ApiService {

  constructor(private http: HttpClient) {}



  getData() {

    return this.http.get('/api/data').subscribe(response => {

      console.log(response);

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular para optimizar el rendimiento?

Optimice el rendimiento utilizando ChangeDetectionStrategy:

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



@Component({

  selector: 'app-performance',

  template: '<p>Optimized Component</p>',

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class PerformanceComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@Directive` de Angular para crear un comportamiento personalizado en sus componentes?

Crear comportamiento personalizado usando @Directive:

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {}



  @HostListener('mouseenter') onMouseEnter() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

  }



  @HostListener('mouseleave') onMouseLeave() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'transparent');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@NgModule` de Angular para configurar las importaciones y exportaciones de módulos?

Configure las importaciones y exportaciones de módulos usando @NgModule:

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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';



@NgModule({

  imports: [CommonModule],

  declarations: [FeatureComponent],

  exports: [FeatureComponent]

})

export class FeatureModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@Optional` de Angular para proporcionar dependencias opcionales?

Proporcionar dependencias opcionales usando @Optional:

import { Injectable, Optional } from '@angular/core';



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Optional() private optionalDependency?: AnyDependency) { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `@Self` de Angular para proporcionar dependencias solo del inyector actual?

Proporcionar dependencias del inyector actual usando @Self:

import { Injectable, Self } from '@angular/core';



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Self() private selfService: OtherService) { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `ng-content` de Angular para crear una proyección de contenido dinámico?

Cree una proyección de contenido dinámico utilizando ng-content:

<ng-content></ng-content>

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `@Host` de Angular para inyectar dependencias desde un componente principal?

Inyecte dependencias de un componente principal usando @Host:

import { Injectable, Host } from '@angular/core';



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Host() private parentService: ParentService) { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `@ViewEncapsulation` de Angular para administrar los estilos de los componentes?

Administrar estilos de componentes usando @ViewEncapsulation:

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



@Component({

  selector: 'app-styled',

  template: '<p>Styled Component</p>',

  styles: ['p { color: red; }'],

  encapsulation: ViewEncapsulation.None

})

export class StyledComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `ChangeDetectorRef` de Angular para activar manualmente la detección de cambios?

Activar manualmente la detección de cambios usando ChangeDetectorRef:

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



@Component({

  selector: 'app-detect',

  template: '<p>Manual Change Detection</p>'

})

export class DetectComponent {

  constructor(private cdr: ChangeDetectorRef) { }



  triggerChange() {

    this.cdr.detectChanges();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@Directive` de Angular para crear directivas estructurales?

Crear directivas estructurales usando @Directive:

import { Directive, TemplateRef, ViewContainerRef } from '@angular/core';



@Directive({

  selector: '[appUnless]'

})

export class UnlessDirective {

  constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) {}



  @Input() set appUnless(condition: boolean) {

    if (!condition) {

      this.viewContainer.createEmbeddedView(this.templateRef);

    } else {

      this.viewContainer.clear();

    }

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utilizan `@Host` y `@Self` de Angular para controlar la inyección de dependencia?

Controlar la inyección de dependencia usando @Host and @Self:

import { Injectable, Host, Self } from '@angular/core';



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Host() @Self() private parentService: ParentService) { }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 16

1. ¿Cómo se crea una directiva Angular personalizada para manipular elementos DOM?

Cree una directiva personalizada para manipular elementos DOM:

import { Directive, ElementRef, Renderer2 } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utilizan los decoradores `@Input` y `@Output` de Angular para crear comunicación de componentes?

Comunicación de componentes mediante @Input and @Output:

import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

  selector: 'app-child',

  template: '<button (click)="sendMessage()">Send Message</button>'

})

export class ChildComponent {

  @Input() childInput!: string;

  @Output() childOutput = new EventEmitter<string>();



  sendMessage() {

    this.childOutput.emit('Message from child');

  }

}



@Component({

  selector: 'app-parent',

  template: '<app-child [childInput]="parentData" (childOutput)="receiveMessage($event)"></app-child>'

})

export class ParentComponent {

  parentData = 'Data from parent';



  receiveMessage(message: string) {

    console.log(message);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se crean y utilizan los servicios Angular para la gestión estatal?

Crear y utilizar servicios para la gestión estatal:

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

import { BehaviorSubject } from 'rxjs';



@Injectable({

  providedIn: 'root'

})

export class StateService {

  private state = new BehaviorSubject<string>('initial state');

  currentState = this.state.asObservable();



  changeState(newState: string) {

    this.state.next(newState);

  }

}



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

import { StateService } from './state.service';



@Component({

  selector: 'app-example',

  template: '<p>State: {{ state | async }}</p>'

})

export class ExampleComponent implements OnInit {

  state: Observable<string>;



  constructor(private stateService: StateService) {}



  ngOnInit() {

    this.state = this.stateService.currentState;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se implementa la carga diferida de módulos en Angular?

Implementar carga diferida de módulos:

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

import { Routes, RouterModule } from '@angular/router';

import { LazyLoadedComponent } from './lazy-loaded.component';



const routes: Routes = [

  { path: 'lazy', component: LazyLoadedComponent }

];



@NgModule({

  imports: [RouterModule.forChild(routes)],

  exports: [RouterModule]

})

export class LazyLoadedRoutingModule { }



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

import { CommonModule } from '@angular/common';

import { LazyLoadedRoutingModule } from './lazy-loaded-routing.module';

import { LazyLoadedComponent } from './lazy-loaded.component';



@NgModule({

  declarations: [LazyLoadedComponent],

  imports: [

    CommonModule,

    LazyLoadedRoutingModule

  ]

})

export class LazyLoadedModule { }



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

import { RouterModule, Routes } from '@angular/router';



const routes: Routes = [

  { path: 'lazy', loadChildren: () => import('./lazy-loaded/lazy-loaded.module').then(m => m.LazyLoadedModule) }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se configura Angular CLI para compilaciones de producción?

Configurar Angular CLI para compilaciones de producción angular.json:

"architect": {

  "build": {

    "configurations": {

      "production": {

        "fileReplacements": [

          {

            "replace": "src/environments/environment.ts",

            "with": "src/environments/environment.prod.ts"

          }

        ],

        "optimization": true,

        "outputHashing": "all",

        "sourceMap": false,

        "extractCss": true,

        "namedChunks": false,

        "aot": true,

        "extractLicenses": true,

        "vendorChunk": false,

        "buildOptimizer": true,

        "serviceWorker": true

      }

    }

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se manejan los errores globalmente en Angular?

Manejar errores globalmente usando HttpInterceptor:

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

import { HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse } from '@angular/common/http';

import { catchError } from 'rxjs/operators';

import { throwError } from 'rxjs';



@Injectable()

export class ErrorInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler) {

    return next.handle(req).pipe(

      catchError((error: HttpErrorResponse) => {

        console.error('Error occurred:', error);

        return throwError(error);

      })

    );

  }

}



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

import { HTTP_INTERCEPTORS } from '@angular/common/http';

import { ErrorInterceptor } from './error.interceptor';



@NgModule({

  providers: [

    { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }

  ]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `@NgModule` de Angular para definir módulos compartidos?

Definir módulos compartidos usando @NgModule:

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

import { CommonModule } from '@angular/common';

import { SharedComponent } from './shared.component';



@NgModule({

  declarations: [SharedComponent],

  imports: [CommonModule],

  exports: [SharedComponent]

})

export class SharedModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza `@Injectable` de Angular para crear y utilizar servicios con inyección de dependencia?

Cree y utilice servicios con inyección de dependencia:

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



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor() { }



  getServiceData() {

    return 'Service Data';

  }

}



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

import { MyService } from './my.service';



@Component({

  selector: 'app-example',

  template: '<p>{{ data }}</p>'

})

export class ExampleComponent implements OnInit {

  data!: string;



  constructor(private myService: MyService) { }



  ngOnInit() {

    this.data = this.myService.getServiceData();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos DOM nativos?

Escuche eventos DOM nativos usando @HostListener:

import { Directive, HostListener } from '@angular/core';



@Directive({

  selector: '[appClickTracker]'

})

export class ClickTrackerDirective {



  @HostListener('click', ['$event'])

  onClick(event: Event) {

    console.log('Element clicked:', event);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `@ContentChild` de Angular para acceder al contenido proyectado?

Acceda al contenido proyectado usando @ContentChild:

import { Component, ContentChild, AfterContentInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: '<ng-content></ng-content>'

})

export class ParentComponent implements AfterContentInit {

  @ContentChild(ChildComponent) contentChild!: ChildComponent;



  ngAfterContentInit() {

    console.log('Projected content:', this.contentChild);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@ViewChild` de Angular para acceder a un componente secundario?

Acceda a un componente secundario usando @ViewChild:

import { Component, ViewChild, AfterViewInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: '<app-child></app-child>'

})

export class ParentComponent implements AfterViewInit {

  @ViewChild(ChildComponent) childComponent!: ChildComponent;



  ngAfterViewInit() {

    console.log('Child component:', this.childComponent);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@Inject` de Angular para proporcionar tokens personalizados para la inyección de dependencia?

Proporcionar tokens personalizados usando @Inject:

import { InjectionToken, Inject, Injectable } from '@angular/core';



export const MY_CUSTOM_TOKEN = new InjectionToken<string>('MyCustomToken');



@Injectable({

  providedIn: 'root'

})

export class MyService {

  constructor(@Inject(MY_CUSTOM_TOKEN) private token: string) {

    console.log('Token:', this.token);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@NgModule` de Angular para administrar módulos de funciones cargados de forma diferida?

Administre módulos de funciones cargados de forma diferida usando @NgModule:

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

import { CommonModule } from '@angular/common';

import { FeatureRoutingModule } from './feature-routing.module';

import { FeatureComponent } from './feature.component';



@NgModule({

  declarations: [FeatureComponent],

  imports: [

    CommonModule,

    FeatureRoutingModule

  ]

})

export class FeatureModule { }



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

import { RouterModule, Routes } from '@angular/router';



const routes: Routes = [

  { path: 'feature', loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule) }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza la `ChangeDetectionStrategy` de Angular para optimizar la detección de cambios?

Optimice la detección de cambios usando ChangeDetectionStrategy:

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



@Component({

  selector: 'app-optimized',

  template: '<p>Optimized Change Detection</p>',

  changeDetection: ChangeDetectionStrategy.OnPush

})

export class OptimizedComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `@Pipe` de Angular para crear canalizaciones personalizadas para la transformación de datos?

Cree canalizaciones personalizadas para la transformación de datos:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'reverse'

})

export class ReversePipe implements PipeTransform {

  transform(value: string): string {

    return value.split('').reverse().join('');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `NgModule` de Angular para declarar e importar módulos de terceros?

Declarar e importar módulos de terceros en NgModule:

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

import { BrowserModule } from '@angular/platform-browser';

import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';



@NgModule({

  declarations: [AppComponent],

  imports: [

    BrowserModule,

    HttpClientModule

  ],

  providers: [],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `@HostBinding` de Angular para vincular propiedades a elementos host?

Vincular propiedades a elementos host usando @HostBinding:

import { Directive, HostBinding } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  @HostBinding('style.backgroundColor') backgroundColor = 'yellow';

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `@HostListener` de Angular para escuchar eventos de elementos host?

Escuche eventos de elementos host usando @HostListener:

import { Directive, HostListener } from '@angular/core';



@Directive({

  selector: '[appClickTracker]'

})

export class ClickTrackerDirective {

  @HostListener('click', ['$event'])

  onClick(event: Event) {

    console.log('Element clicked:', event);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@ContentChildren` de Angular para acceder a múltiples elementos de contenido proyectados?

Acceda a múltiples elementos de contenido proyectados usando @ContentChildren:

import { Component, ContentChildren, QueryList, AfterContentInit } from '@angular/core';

import { ChildComponent } from './child.component';



@Component({

  selector: 'app-parent',

  template: '<ng-content select="app-child"></ng-content>'

})

export class ParentComponent implements AfterContentInit {

  @ContentChildren(ChildComponent) contentChildren!: QueryList<ChildComponent>;



  ngAfterContentInit() {

    this.contentChildren.forEach(child => console.log('Projected child:', child));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `@NgModule` de Angular para configurar y proporcionar servicios globales?

Configurar y proporcionar servicios globales utilizando @NgModule:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { GlobalService } from './global.service';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [GlobalService],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 17

1. ¿Cómo se utiliza `@Pipe` de Angular para crear una tubería personalizada para formatear fechas?

Cree una tubería de fecha personalizada:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'customDate'

})

export class CustomDatePipe implements PipeTransform {

  transform(value: Date, format: string = 'MM/dd/yyyy'): string {

    const options: Intl.DateTimeFormatOptions = {

      year: 'numeric',

      month: '2-digit',

      day: '2-digit'

    };

    return new Intl.DateTimeFormat('en-US', options).format(value);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `@Injectable` de Angular para proporcionar un servicio a nivel de módulo?

Proporcionar un servicio a nivel de módulo:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { MyService } from './my.service';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [MyService],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza `HttpClient` de Angular para realizar solicitudes HTTP con encabezados?

Realice solicitudes HTTP con encabezados:

import { HttpClient, HttpHeaders } from '@angular/common/http';

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



@Injectable({

  providedIn: 'root'

})

export class ApiService {

  constructor(private http: HttpClient) {}



  getData() {

    const headers = new HttpHeaders({

      'Authorization': 'Bearer your-token'

    });

    return this.http.get('/api/data', { headers });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza el `Router` de Angular para manejar los guardias de ruta para la autenticación?

Manejar guardias de ruta para autenticación:

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

import { CanActivate, Router } from '@angular/router';



@Injectable({

  providedIn: 'root'

})

export class AuthGuard implements CanActivate {

  constructor(private router: Router) {}



  canActivate(): boolean {

    const isAuthenticated = false; // Replace with real authentication check

    if (!isAuthenticated) {

      this.router.navigate(['/login']);

      return false;

    }

    return true;

  }

}



const routes: Routes = [

  { path: 'protected', component: ProtectedComponent, canActivate: [AuthGuard] }

];

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `@NgModule` de Angular para configurar y proporcionar configuraciones globales?

Configurar y proporcionar configuraciones globales:

import { NgModule, InjectionToken } from '@angular/core';

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



export const API_CONFIG = new InjectionToken<string>('API_CONFIG');



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [

    { provide: API_CONFIG, useValue: 'https://api.example.com' }

  ],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `@NgModule` de Angular para definir módulos de funciones?

Definir módulos de funciones:

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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';



@NgModule({

  declarations: [FeatureComponent],

  imports: [CommonModule],

  exports: [FeatureComponent]

})

export class FeatureModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `@NgModule` de Angular para importar y configurar módulos de terceros?

Importe y configure módulos de terceros:

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

import { BrowserModule } from '@angular/platform-browser';

import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';

import { ThirdPartyModule } from 'third-party-library';



@NgModule({

  declarations: [AppComponent],

  imports: [

    BrowserModule,

    HttpClientModule,

    ThirdPartyModule.forRoot({ apiKey: 'your-api-key' })

  ],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza `@Component` de Angular para configurar y administrar los metadatos de los componentes?

Configure y administre metadatos de componentes:

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



@Component({

  selector: 'app-example',

  templateUrl: './example.component.html',

  styleUrls: ['./example.component.css'],

  animations: [ /* animations here */ ]

})

export class ExampleComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `@NgModule` de Angular para definir y utilizar directivas personalizadas?

Definir y utilizar directivas personalizadas:

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

import { CommonModule } from '@angular/common';

import { HighlightDirective } from './highlight.directive';



@NgModule({

  declarations: [HighlightDirective],

  imports: [CommonModule],

  exports: [HighlightDirective]

})

export class SharedModule { }



import { Directive, ElementRef, Renderer2 } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `@NgModule` de Angular para configurar y proporcionar servicios globales?

Configurar y proporcionar servicios globales:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { GlobalService } from './global.service';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [GlobalService],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@Component` de Angular para crear y administrar componentes reutilizables?

Cree y administre componentes reutilizables:

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



@Component({

  selector: 'app-reusable',

  template: '<p>Hello, {{ name }}!</p>',

  styleUrls: ['./reusable.component.css']

})

export class ReusableComponent {

  @Input() name!: string;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@Directive` de Angular para crear un comportamiento personalizado para elementos DOM?

Cree un comportamiento personalizado para elementos DOM:

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

  selector: '[appHover]'

})

export class HoverDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {}



  @HostListener('mouseenter') onMouseEnter() {

    this.renderer.setStyle(this.el.nativeElement, 'color', 'blue');

  }



  @HostListener('mouseleave') onMouseLeave() {

    this.renderer.setStyle(this.el.nativeElement, 'color', 'black');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@NgModule` de Angular para configurar y proporcionar módulos de enrutamiento?

Configure y proporcione módulos de enrutamiento:

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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';

import { AboutComponent } from './about.component';



const routes: Routes = [

  { path: '', component: HomeComponent },

  { path: 'about', component: AboutComponent }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `@Component` de Angular para gestionar los enlaces del ciclo de vida de los componentes?

Gestionar los enlaces del ciclo de vida de los componentes:

import { Component, OnInit, OnDestroy } from '@angular/core';



@Component({

  selector: 'app-lifecycle',

  template: '<p>Lifecycle Component</p>'

})

export class LifecycleComponent implements OnInit, OnDestroy {

  ngOnInit() {

    console.log('Component initialized');

  }



  ngOnDestroy() {

    console.log('Component destroyed');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `@NgModule` de Angular para declarar y utilizar servicios compartidos?

Declarar y utilizar servicios compartidos:

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

import { CommonModule } from '@angular/common';

import { SharedService } from './shared.service';



@NgModule({

  declarations: [],

  imports: [CommonModule],

  providers: [SharedService],

  exports: []

})

export class SharedModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `@Injectable` de Angular para crear y utilizar servicios con diferentes alcances?

Crear y utilizar servicios con diferentes alcances:

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



@Injectable({

  providedIn: 'root' // Singleton service

})

export class SingletonService { }



@Injectable({

  providedIn: 'any' // Service available in any injector

})

export class ScopedService { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `@NgModule` de Angular para configurar y proporcionar módulos asincrónicos?

Configure y proporcione módulos asincrónicos:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { HttpClientModule } from '@angular/common/http';

import { MyAsyncModule } from './my-async.module';



@NgModule({

  declarations: [AppComponent],

  imports: [

    BrowserModule,

    HttpClientModule,

    MyAsyncModule

  ],

  bootstrap: [AppComponent]

})

export class AppModule { }



@NgModule({

  imports: [

    HttpClientModule

  ]

})

export class MyAsyncModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `@NgModule` de Angular para proporcionar manejo global de errores?

Proporcionar manejo de errores globales:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

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

import { GlobalErrorHandler } from './global-error-handler';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [{ provide: ErrorHandler, useClass: GlobalErrorHandler }],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@NgModule` de Angular para configurar y proporcionar servicios de autenticación?

Configurar y proporcionar servicios de autenticación:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { AuthService } from './auth.service';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [AuthService],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `@NgModule` de Angular para gestionar la internacionalización (i18n)?

Gestionar la internacionalización (i18n):

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

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

import { registerLocaleData } from '@angular/common';

import localeEs from '@angular/common/locales/es';



registerLocaleData(localeEs);



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [{ provide: LOCALE_ID, useValue: 'es' }],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 18

1. ¿Cómo se utiliza `@NgModule` de Angular para configurar la carga diferida de módulos?

Configure la carga diferida de módulos:

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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';



const routes: Routes = [

  { path: '', component: HomeComponent },

  {

    path: 'feature',

    loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule)

  }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `@NgModule` de Angular para definir y utilizar módulos de funciones?

Definir y utilizar módulos de funciones:

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

import { CommonModule } from '@angular/common';

import { FeatureComponent } from './feature.component';



@NgModule({

  declarations: [FeatureComponent],

  imports: [CommonModule],

  exports: [FeatureComponent]

})

export class FeatureModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza `@Component` de Angular para manejar escenarios complejos de enlace de datos?

Maneje escenarios complejos de enlace de datos:

import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

  selector: 'app-complex-data',

  template: `

    <input [(ngModel)]="data.inputValue" />

    <button (click)="sendData()">Send</button>

  `,

  styleUrls: ['./complex-data.component.css']

})

export class ComplexDataComponent {

  @Input() data: any;

  @Output() dataChange = new EventEmitter<any>();



  sendData() {

    this.dataChange.emit(this.data);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `@Directive` de Angular para crear una directiva personalizada para la validación de formularios?

Cree una directiva personalizada para la validación de formularios:

import { Directive, Input } from '@angular/core';

import { NG_VALIDATORS, Validator, AbstractControl, ValidationErrors } from '@angular/forms';



@Directive({

  selector: '[appCustomValidator]',

  providers: [{ provide: NG_VALIDATORS, useExisting: CustomValidatorDirective, multi: true }]

})

export class CustomValidatorDirective implements Validator {

  @Input('appCustomValidator') forbiddenName: string;



  validate(control: AbstractControl): ValidationErrors | null {

    return control.value === this.forbiddenName ? { 'forbiddenName': true } : null;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `@Component` de Angular para administrar componentes anidados?

Administrar componentes anidados:

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



@Component({

  selector: 'app-parent',

  template: `

    <app-child [data]="parentData"></app-child>

  `

})

export class ParentComponent {

  parentData = 'Data from parent';

}



@Component({

  selector: 'app-child',

  template: '<p>{{ data }}</p>'

})

export class ChildComponent {

  @Input() data: string;

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `@NgModule` de Angular para proporcionar ajustes de configuración global?

Proporcionar ajustes de configuración globales:

import { NgModule, InjectionToken } from '@angular/core';

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';



export const APP_CONFIG = new InjectionToken<string>('APP_CONFIG');



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [

    { provide: APP_CONFIG, useValue: 'https://api.example.com' }

  ],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `@NgModule` de Angular para configurar y utilizar la inyección de dependencia en los servicios?

Configure y utilice la inyección de dependencia en servicios:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { DataService } from './data.service';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [DataService],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza `@Component` de Angular para gestionar formularios reactivos con validación?

Gestionar formularios reactivos con validación:

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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

  selector: 'app-reactive-form',

  template: `

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

      <input formControlName="name" />

      <div *ngIf="form.controls.name.invalid && form.controls.name.touched">

        Name is required

      </div>

      <button type="submit">Submit</button>

    </form>

  `

})

export class ReactiveFormComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      name: ['', Validators.required]

    });

  }



  onSubmit() {

    console.log(this.form.value);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `@Component` de Angular para manejar los enlaces del ciclo de vida de los componentes para optimizar el rendimiento?

Optimice el rendimiento utilizando enlaces de ciclo de vida:

import { Component, OnInit, OnDestroy } from '@angular/core';



@Component({

  selector: 'app-optimization',

  template: '<p>Optimized Component</p>'

})

export class OptimizationComponent implements OnInit, OnDestroy {

  ngOnInit() {

    console.log('Component initialized');

    // Initialization code here

  }



  ngOnDestroy() {

    console.log('Component destroyed');

    // Cleanup code here

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `@Directive` de Angular para crear un comportamiento personalizado para los componentes?

Cree un comportamiento personalizado para los componentes:

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

  selector: '[appCustomBehavior]'

})

export class CustomBehaviorDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {}



  @HostListener('click') onClick() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'blue');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@NgModule` de Angular para configurar y utilizar interceptores HTTP?

Configure y utilice interceptores HTTP:

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

import { BrowserModule } from '@angular/platform-browser';

import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';

import { AppComponent } from './app.component';

import { AuthInterceptor } from './auth.interceptor';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule, HttpClientModule],

  providers: [

    { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }

  ],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@NgModule` de Angular para configurar y utilizar elementos angulares?

Configurar y utilizar elementos angulares:

import { NgModule, Injector } from '@angular/core';

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { createCustomElement } from '@angular/elements';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  entryComponents: [AppComponent]

})

export class AppModule {

  constructor(private injector: Injector) {

    const el = createCustomElement(AppComponent, { injector });

    customElements.define('my-element', el);

  }



  ngDoBootstrap() {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@NgModule` de Angular para configurar y utilizar la carga diferida de módulos con `RouterModule`?

Configure y utilice la carga diferida del módulo con `RouterModule`:

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

import { RouterModule, Routes } from '@angular/router';

import { HomeComponent } from './home.component';



const routes: Routes = [

  { path: '', component: HomeComponent },

  {

    path: 'lazy',

    loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule)

  }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `@Component` de Angular para manejar la representación condicional con `*ngIf`?

Manejar la representación condicional con `*ngIf`:

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



@Component({

  selector: 'app-conditional',

  template: `

    <div *ngIf="showContent">

      Content is visible

    </div>

    <button (click)="toggleContent()">Toggle Content</button>

  `

})

export class ConditionalComponent {

  showContent = true;



  toggleContent() {

    this.showContent = !this.showContent;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `@Component` de Angular para manejar la carga dinámica de componentes?

Manejar la carga dinámica de componentes:

import { Component, ComponentFactoryResolver, ViewChild, ViewContainerRef } from '@angular/core';

import { DynamicComponent } from './dynamic.component';



@Component({

  selector: 'app-dynamic-loader',

  template: `

    <ng-template #container></ng-template>

    <button (click)="loadComponent()">Load Component</button>

  `

})

export class DynamicLoaderComponent {

  @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;



  constructor(private resolver: ComponentFactoryResolver) {}



  loadComponent() {

    const factory = this.resolver.resolveComponentFactory(DynamicComponent);

    this.container.createComponent(factory);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `@Component` de Angular para gestionar las interacciones de los componentes usando `@Input` y `@Output`?

Administre las interacciones de los componentes usando `@Input` y `@Output`:

import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

  selector: 'app-parent',

  template: `

    <app-child [data]="parentData" (dataChange)="onDataChange($event)"></app-child>

  `

})

export class ParentComponent {

  parentData = 'Data from parent';



  onDataChange(data: string) {

    console.log('Data from child:', data);

  }

}



@Component({

  selector: 'app-child',

  template: `

    <input [(ngModel)]="data" />

    <button (click)="sendData()">Send</button>

  `

})

export class ChildComponent {

  @Input() data: string;

  @Output() dataChange = new EventEmitter<string>();



  sendData() {

    this.dataChange.emit(this.data);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `@Component` de Angular para administrar controles de formulario con `FormArray`?

Administre controles de formulario con `FormArray`:

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

import { FormBuilder, FormArray, FormGroup, Validators } from '@angular/forms';



@Component({

  selector: 'app-form-array',

  template: `

    <form [formGroup]="form">

      <div formArrayName="items">

        <div *ngFor="let item de items.controls; let i = index">

          <input [formControlName]="i" />

        </div>

      </div>

      <button (click)="addItem()">Add Item</button>

    </form>

  `

})

export class FormArrayComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      items: this.fb.array([this.fb.control('')])

    });

  }



  get items(): FormArray {

    return this.form.get('items') as FormArray;

  }



  addItem() {

    this.items.push(this.fb.control(''));

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `@Component` de Angular para administrar y manejar solicitudes HTTP con `HttpClient`?

Administre y maneje solicitudes HTTP con `HttpClient`:

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

import { HttpClient } from '@angular/common/http';



@Component({

  selector: 'app-http',

  template: `

    <button (click)="fetchData()">Fetch Data</button>

    <p *ngIf="data">Data: {{ data | json }}</p>

  `

})

export class HttpComponent {

  data: any;



  constructor(private http: HttpClient) {}



  fetchData() {

    this.http.get('https://api.example.com/data').subscribe(response => {

      this.data = response;

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@NgModule` de Angular para proporcionar proveedores personalizados para la inyección de dependencias?

Proporcione proveedores personalizados para la inyección de dependencia:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { MyService } from './my.service';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule],

  providers: [

    { provide: MyService, useClass: MyService }

  ],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `@Component` de Angular para crear un componente modal reutilizable?

Cree un componente modal reutilizable:

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



@Component({

  selector: 'app-modal',

  template: `

    <div class="modal" *ngIf="isVisible">

      <div class="modal-content">

        <ng-content></ng-content>

        <button (click)="close()">Close</button>

      </div>

    </div>

  `,

  styles: [`

    .modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); display: flex; justify-content: center; align-items: center; }

    .modal-content { background: #fff; padding: 20px; border-radius: 5px; }

  `]

})

export class ModalComponent {

  isVisible = false;



  open() {

    this.isVisible = true;

  }



  close() {

    this.isVisible = false;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 19

1. ¿Cómo se utiliza `@Component` de Angular para implementar un validador personalizado para un control de formulario?

Implemente un validador personalizado para un control de formulario:

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

import { FormBuilder, FormGroup, Validators, ValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms';



@Component({

  selector: 'app-custom-validator',

  template: `

    <form [formGroup]="form">

      <input formControlName="username" />

      <div *ngIf="form.get('username').hasError('customError')">Custom error message</div>

    </form>

  `

})

export class CustomValidatorComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      username: ['', [this.customValidator()]]

    });

  }



  customValidator(): ValidatorFn {

    return (control: AbstractControl): ValidationErrors | null => {

      const isValid = /^[a-zA-Z0-9_]+$/.test(control.value);

      return isValid ? null : { customError: true };

    };

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `@NgModule` de Angular para configurar una aplicación Angular con Angular Universal para renderizado del lado del servidor?

Configurar una aplicación Angular con Angular Universal:

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

import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { AppServerModule } from './app.server.module';



@NgModule({

  imports: [

    BrowserModule.withServerTransition({ appId: 'my-app' }),

    AppServerModule

  ],

  declarations: [AppComponent],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se utiliza `@Component` de Angular para crear una directiva que modifica el estilo del elemento host?

Cree una directiva que modifique el estilo del elemento anfitrión:

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';



@Directive({

  selector: '[appHighlight]'

})

export class HighlightDirective {

  constructor(private el: ElementRef, private renderer: Renderer2) {}



  @HostListener('mouseenter') onMouseEnter() {

    this.renderer.setStyle(this.el.nativeElement, 'backgroundColor', 'yellow');

  }



  @HostListener('mouseleave') onMouseLeave() {

    this.renderer.removeStyle(this.el.nativeElement, 'backgroundColor');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `@Component` de Angular para manejar el ciclo de vida de un componente con `ngOnInit` y `ngOnDestroy`?

Maneje el ciclo de vida de un componente con `ngOnInit` y `ngOnDestroy`:

import { Component, OnInit, OnDestroy } from '@angular/core';



@Component({

  selector: 'app-lifecycle',

  template: `

    <p>Component Lifecycle</p>

  `

})

export class LifecycleComponent implements OnInit, OnDestroy {



  ngOnInit() {

    console.log('Component Initialized');

  }



  ngOnDestroy() {

    console.log('Component Destroyed');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `@NgModule` de Angular para crear un módulo de funciones con sus propias rutas?

Cree un módulo de funciones con sus propias rutas:

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

import { RouterModule, Routes } from '@angular/router';

import { FeatureComponent } from './feature.component';



const routes: Routes = [

  { path: '', component: FeatureComponent }

];



@NgModule({

  imports: [RouterModule.forChild(routes)],

  declarations: [FeatureComponent]

})

export class FeatureModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `@NgModule` de Angular para configurar interceptores de clientes HTTP?

Configure interceptores de clientes HTTP:

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

import { BrowserModule } from '@angular/platform-browser';

import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';

import { AppComponent } from './app.component';

import { AuthInterceptor } from './auth.interceptor';



@NgModule({

  declarations: [AppComponent],

  imports: [BrowserModule, HttpClientModule],

  providers: [

    { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }

  ],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `@Component` de Angular para implementar un formulario con grupos de formularios anidados?

Implemente un formulario con grupos de formularios anidados:

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

import { FormBuilder, FormGroup } from '@angular/forms';



@Component({

  selector: 'app-nested-form',

  template: `

    <form [formGroup]="form">

      <div formGroupName="address">

        <input formControlName="street" />

        <input formControlName="city" />

      </div>

      <button (click)="submit()">Submit</button>

    </form>

  `

})

export class NestedFormComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      address: this.fb.group({

        street: [''],

        city: ['']

      })

    });

  }



  submit() {

    console.log(this.form.value);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se usa `@Component` de Angular para crear un componente que usa la proyección de contenido de Angular con `ng-content`?

Cree un componente que utilice proyección de contenido:

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



@Component({

  selector: 'app-wrapper',

  template: `

    <div class="wrapper">

      <ng-content></ng-content>

    </div>

  `,

  styles: [`

    .wrapper { border: 1px solid #ccc; padding: 10px; }

  `]

})

export class WrapperComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `@Component` de Angular para gestionar las interacciones de los componentes mediante Angular Services?

Administre las interacciones de los componentes utilizando Angular Services:

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

import { BehaviorSubject } from 'rxjs';



@Injectable({

  providedIn: 'root'

})

export class DataService {

  private dataSubject = new BehaviorSubject<string>('Initial Data');

  data$ = this.dataSubject.asObservable();



  updateData(newData: string) {

    this.dataSubject.next(newData);

  }

}



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

import { DataService } from './data.service';



@Component({

  selector: 'app-consumer',

  template: `

    <p>Data: {{ data }}</p>

    <button (click)="changeData()">Change Data</button>

  `

})

export class ConsumerComponent implements OnInit {

  data: string;



  constructor(private dataService: DataService) {}



  ngOnInit() {

    this.dataService.data$.subscribe(data => this.data = data);

  }



  changeData() {

    this.dataService.updateData('New Data');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `@NgModule` de Angular para configurar la carga diferida de módulos de funciones?

Configure la carga diferida de módulos de funciones:

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

import { RouterModule, Routes } from '@angular/router';

import { MainComponent } from './main.component';



const routes: Routes = [

  { path: '', component: MainComponent },

  { path: 'feature', loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule) }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@NgModule` de Angular para configurar un módulo con proveedores para diferentes entornos?

Configure un módulo con proveedores para diferentes entornos:

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

import { HttpClientModule } from '@angular/common/http';

import { environment } from '../environments/environment';



@NgModule({

  imports: [HttpClientModule],

  providers: [

    { provide: 'API_URL', useValue: environment.apiUrl }

  ]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@Component` de Angular para crear un componente de diálogo reutilizable?

Cree un componente de diálogo reutilizable:

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



@Component({

  selector: 'app-dialog',

  template: `

    <div class="dialog">

      <div class="dialog-content">

        <ng-content></ng-content>

      </div>

    </div>

  `,

  styles: [`

    .dialog { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); display: flex; justify-content: center; align-items: center; }

    .dialog-content { background: #fff; padding: 20px; border-radius: 5px; }

  `]

})

export class DialogComponent {}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@Component` de Angular para implementar un cargador de componentes dinámico?

Implemente un cargador de componentes dinámico:

import { Component, ComponentFactoryResolver, ViewContainerRef, OnInit } from '@angular/core';



@Component({

  selector: 'app-dynamic-loader',

  template: `

    <ng-template #dynamicContainer></ng-template>

  `

})

export class DynamicLoaderComponent implements OnInit {

  @ViewChild('dynamicContainer', { read: ViewContainerRef }) container: ViewContainerRef;



  constructor(private componentFactoryResolver: ComponentFactoryResolver) {}



  ngOnInit() {

    const componentFactory = this.componentFactoryResolver.resolveComponentFactory(SomeDynamicComponent);

    this.container.createComponent(componentFactory);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `@Component` de Angular para administrar animaciones con la biblioteca de animaciones de Angular?

Administre animaciones con la biblioteca de animaciones de Angular:

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

import { trigger, state, style, transition, animate } from '@angular/animations';



@Component({

  selector: 'app-animated',

  template: `

    <div [@fadeInOut]="state" (click)="toggle()">Click me to toggle animation</div>

  `,

  animations: [

    trigger('fadeInOut', [

      state('in', style({ opacity: 1 })),

      state('out', style({ opacity: 0 })),

      transition('in <=> out', [animate('0.5s')])

    ])

  ]

})

export class AnimatedComponent {

  state = 'in';



  toggle() {

    this.state = this.state === 'in' ? 'out' : 'in';

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `@NgModule` de Angular para proporcionar ajustes de configuración para un entorno específico?

Proporcione ajustes de configuración para un entorno específico:

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

import { CommonModule } from '@angular/common';

import { HttpClientModule } from '@angular/common/http';

import { environment } from '../environments/environment';



@NgModule({

  imports: [CommonModule, HttpClientModule],

  providers: [

    { provide: 'API_URL', useValue: environment.apiUrl }

  ]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `@Component` de Angular para gestionar la validación de formularios con validadores asincrónicos?

Gestione la validación de formularios con validadores asíncronos:

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

import { FormBuilder, FormGroup, AsyncValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms';

import { Observable, de } from 'rxjs';

import { debounceTime, map, catchError } from 'rxjs/operators';



@Component({

  selector: 'app-async-validator',

  template: `

    <form [formGroup]="form">

      <input formControlName="username" />

      <div *ngIf="form.get('username').hasError('asyncError')">Username is already taken</div>

    </form>

  `

})

export class AsyncValidatorComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      username: ['', [], [this.asyncValidator()]]

    });

  }



  asyncValidator(): AsyncValidatorFn {

    return (control: AbstractControl): Observable<ValidationErrors | null> => {

      return of(control.value).pipe(

        debounceTime(300),

        map(value => value === 'admin' ? { asyncError: true } : null),

        catchError(() => of(null))

      );

    };

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `@Component` de Angular para implementar una tubería personalizada para transformar datos?

Implemente una tubería personalizada para transformar datos:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'reverse'

})

export class ReversePipe implements PipeTransform {

  transform(value: string): string {

    return value.split('').reverse().join('');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `@Component` de Angular para manejar los guardias de ruta para proteger rutas?

Manejar guardias de ruta para proteger rutas:

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

import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';



@Injectable({

  providedIn: 'root'

})

export class AuthGuard implements CanActivate {



  constructor(private router: Router) {}



  canActivate(

    route: ActivatedRouteSnapshot,

    state: RouterStateSnapshot

  ): boolean {

    const isAuthenticated = false; // Check authentication logic

    if (!isAuthenticated) {

      this.router.navigate(['/login']);

      return false;

    }

    return true;

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@Component` de Angular para crear un componente que escuche eventos de un componente secundario?

Cree un componente que escuche eventos de un componente secundario:

import { Component, EventEmitter, Output } from '@angular/core';



@Component({

  selector: 'app-child',

  template: `<button (click)="notifyParent()">Notify</button>`

})

export class ChildComponent {

  @Output() notify: EventEmitter<void> = new EventEmitter<void>();



  notifyParent() {

    this.notify.emit();

  }

}



@Component({

  selector: 'app-parent',

  template: `

    <app-child (notify)="onNotify()"></app-child>

  `

})

export class ParentComponent {

  onNotify() {

    console.log('Child component event received');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `@Component` de Angular para implementar la inyección de dependencia para servicios?

Implementar inyección de dependencia para servicios:

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

import { DataService } from './data.service';



@Component({

  selector: 'app-example',

  template: `<div>Data: {{ data }}</div>`,

  providers: [DataService]

})

export class ExampleComponent {

  data: string;



  constructor(private dataService: DataService) {

    this.data = this.dataService.getData();

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

Preguntas de nivel avanzado de Angular - Parte 20

1. ¿Cómo se utiliza `@NgModule` de Angular para configurar módulos de funciones con estrategias de precarga y carga diferida?

Configure módulos de funciones con estrategias de carga diferida y precarga:

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

import { RouterModule, Routes } from '@angular/router';

import { MainComponent } from './main.component';



const routes: Routes = [

  { path: '', component: MainComponent },

  { path: 'feature', loadChildren: () => import('./feature/feature.module').then(m => m.FeatureModule) }

];



@NgModule({

  imports: [RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })],

  exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

2. ¿Cómo se utiliza `@NgModule` de Angular para configurar la inyección de dependencia para un escenario de múltiples proveedores?

Configure la inyección de dependencia para un escenario de múltiples proveedores:

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

import { SomeService } from './some.service';

import { AnotherService } from './another.service';



@NgModule({

  providers: [

    { provide: SomeService, useClass: AnotherService, multi: true }

  ]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

3. ¿Cómo se implementa `@Component` de Angular para admitir la proyección de contenido dinámico con múltiples espacios?

Implemente proyección de contenido dinámico con múltiples espacios:

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



@Component({

  selector: 'app-multi-slot',

  template: `

    <ng-content select="[header]"></ng-content>

    <div class="body"><ng-content></ng-content></div>

    <ng-content select="[footer]"></ng-content>

  `,

  styles: [`

    .body { padding: 10px; }

  `]

})

export class MultiSlotComponent { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

4. ¿Cómo se utiliza `@Component` de Angular para administrar y vincular datos a una tabla con funcionalidad de clasificación y filtrado?

Administre y vincule datos a una tabla con clasificación y filtrado:

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

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



@Component({

  selector: 'app-table',

  template: `

    <input [formControl]="filterControl" placeholder="Filter">

    <table>

      <thead>

        <tr>

          <th>Name</th>

          <th>Age</th>

        </tr>

      </thead>

      <tbody>

        <tr *ngFor="let item de filteredItems">

          <td>{{ item.name }}</td>

          <td>{{ item.age }}</td>

        </tr>

      </tbody>

    </table>

  `

})

export class TableComponent {

  filterControl = new FormControl('');

  items = [{ name: 'Alice', age: 30 }, { name: 'Bob', age: 25 }];

  filteredItems = this.items;



  constructor() {

    this.filterControl.valueChanges.subscribe(filterText => {

      this.filteredItems = this.items.filter(item => item.name.includes(filterText));

    });

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

5. ¿Cómo se utiliza `@Component` de Angular para crear un componente que maneje la carga de archivos?

Cree un componente que maneje la carga de archivos:

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



@Component({

  selector: 'app-file-upload',

  template: `

    <input type="file" (change)="onFileChange($event)" />

  `

})

export class FileUploadComponent {

  onFileChange(event) {

    const file = event.target.files[0];

    if (file) {

      console.log('Selected file:', file);

    }

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

6. ¿Cómo se utiliza `@Component` de Angular para administrar el estado con un patrón similar a Redux?

Administre el estado con un patrón similar a Redux:

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

import { Store, Select } from '@ngxs/store';

import { Observable } from 'rxjs';

import { Increment } from './counter.actions';

import { CounterState } from './counter.state';



@Component({

  selector: 'app-counter',

  template: `

    <button (click)="increment()">Increment</button>

    <p>Count: {{ count$ | async }}</p>

  `

})

export class CounterComponent {

  @Select(CounterState.getCount) count$: Observable<number>;



  constructor(private store: Store) {}



  increment() {

    this.store.dispatch(new Increment());

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

7. ¿Cómo se utiliza `@NgModule` de Angular para configurar múltiples enrutadores para diferentes módulos de funciones?

Configure varios enrutadores para diferentes módulos de funciones:

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

import { RouterModule, Routes } from '@angular/router';

import { Feature1Component } from './feature1.component';

import { Feature2Component } from './feature2.component';



const feature1Routes: Routes = [

  { path: 'feature1', component: Feature1Component }

];



const feature2Routes: Routes = [

  { path: 'feature2', component: Feature2Component }

];



@NgModule({

  imports: [

    RouterModule.forChild(feature1Routes),

    RouterModule.forChild(feature2Routes)

  ],

  exports: [RouterModule]

})

export class FeatureRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

8. ¿Cómo se utiliza `@Component` de Angular para crear una directiva personalizada para alternar la visibilidad?

Cree una directiva personalizada para alternar la visibilidad:

import { Directive, ElementRef, Input, Renderer2 } from '@angular/core';



@Directive({

  selector: '[appToggleVisibility]'

})

export class ToggleVisibilityDirective {

  @Input() set appToggleVisibility(visible: boolean) {

    this.renderer.setStyle(this.el.nativeElement, 'display', visible ? 'block' : 'none');

  }



  constructor(private el: ElementRef, private renderer: Renderer2) {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

9. ¿Cómo se utiliza `@Component` de Angular para integrarse con bibliotecas o API externas?

Integre con bibliotecas externas o API:

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

import { HttpClient } from '@angular/common/http';



@Component({

  selector: 'app-external-api',

  template: `

    <div *ngIf="data">

      <p>Data from API: {{ data | json }}</p>

    </div>

  `

})

export class ExternalApiComponent implements OnInit {

  data: any;



  constructor(private http: HttpClient) {}



  ngOnInit() {

    this.http.get('https://api.example.com/data')

      .subscribe(response => this.data = response);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

10. ¿Cómo se utiliza `@Component` de Angular para gestionar la validación de formularios con formularios reactivos?

Gestione la validación de formularios con formularios reactivos:

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

import { FormBuilder, FormGroup, Validators } from '@angular/forms';



@Component({

  selector: 'app-reactive-form',

  template: `

    <form [formGroup]="form" (ngSubmit)="onSubmit()">

      <input formControlName="name" placeholder="Name" />

      <div *ngIf="form.get('name').invalid && form.get('name').touched">

        Name is required

      </div>

      <button type="submit" [disabled]="form.invalid">Submit</button>

    </form>

  `

})

export class ReactiveFormComponent {

  form: FormGroup;



  constructor(private fb: FormBuilder) {

    this.form = this.fb.group({

      name: ['', Validators.required]

    });

  }



  onSubmit() {

    console.log(this.form.value);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

11. ¿Cómo se utiliza `@Component` de Angular para crear una tubería personalizada para transformar datos?

Cree una tubería personalizada para transformar datos:

import { Pipe, PipeTransform } from '@angular/core';



@Pipe({

  name: 'reverse'

})

export class ReversePipe implements PipeTransform {

  transform(value: string): string {

    return value.split('').reverse().join('');

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

12. ¿Cómo se utiliza `@NgModule` de Angular para configurar rutas con rutas secundarias y guardias de ruta?

Configure rutas con rutas secundarias y guardias de ruta:

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

import { RouterModule, Routes } from '@angular/router';

import { ParentComponent } from './parent.component';

import { ChildComponent } from './child.component';

import { AuthGuard } from './auth.guard';



const routes: Routes = [

  {

    path: 'parent',

    component: ParentComponent,

    canActivate: [AuthGuard],

    children: [

      { path: 'child', component: ChildComponent }

    ]

  }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

13. ¿Cómo se utiliza `@Component` de Angular para implementar animaciones avanzadas con `@angular/animations`?

Implemente animaciones avanzadas con `@angular/animations`:

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

import { trigger, transition, style, animate } from '@angular/animations';



@Component({

  selector: 'app-animate',

  template: `

    <div [@fadeInOut]="state">Content</div>

    <button (click)="toggle()">Toggle</button>

  `,

  animations: [

    trigger('fadeInOut', [

      transition(':enter', [

        style({ opacity: 0 }),

        animate('500ms', style({ opacity: 1 }))

      ]),

      transition(':leave', [

        animate('500ms', style({ opacity: 0 }))

      ])

    ])

  ]

})

export class AnimateComponent {

  state = 'visible';



  toggle() {

    this.state = this.state === 'visible' ? 'hidden' : 'visible';

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

14. ¿Cómo se utiliza `@NgModule` de Angular para configurar la carga dinámica de módulos y la federación de módulos?

Configure la carga dinámica de módulos y la federación de módulos:

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

import { RouterModule, Routes } from '@angular/router';

import { MainComponent } from './main.component';



const routes: Routes = [

  { path: '', component: MainComponent },

  { path: 'dynamic', loadChildren: () => import('./dynamic/dynamic.module').then(m => m.DynamicModule) }

];



@NgModule({

  imports: [RouterModule.forRoot(routes)],

  exports: [RouterModule]

})

export class AppRoutingModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

15. ¿Cómo se utiliza `@Component` de Angular para manejar la internacionalización (i18n) para aplicaciones multilingües?

Manejar la internacionalización (i18n) para aplicaciones multilingües:

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

import { TranslateService } from '@ngx-translate/core';



@Component({

  selector: 'app-i18n',

  template: `

    <div>

      <p>{{ 'WELCOME_MESSAGE' | translate }}</p>

      <button (click)="switchLanguage('en')">English</button>

      <button (click)="switchLanguage('es')">Español</button>

    </div>

  `

})

export class I18nComponent {

  constructor(private translate: TranslateService) {

    translate.setDefaultLang('en');

  }



  switchLanguage(lang: string) {

    this.translate.use(lang);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

16. ¿Cómo se utiliza `@Component` de Angular para implementar un control de formulario personalizado con `ControlValueAccessor`?

Implemente un control de formulario personalizado con `ControlValueAccessor`:

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

import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';



@Component({

  selector: 'app-custom-input',

  template: `

    <input [value]="value" (input)="onChange($event.target.value)" />

  `,

  providers: [

    {

      provide: NG_VALUE_ACCESSOR,

      useExisting: forwardRef(() => CustomInputComponent),

      multi: true

    }

  ]

})

export class CustomInputComponent implements ControlValueAccessor {

  value: any;

  onChange = (value: any) => {};

  onTouched = () => {};



  writeValue(value: any): void {

    this.value = value;

  }



  registerOnChange(fn: (value: any) => void): void {

    this.onChange = fn;

  }



  registerOnTouched(fn: () => void): void {

    this.onTouched = fn;

  }



  setDisabledState?(isDisabled: boolean): void {}

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

17. ¿Cómo se utiliza `@NgModule` de Angular para integrarse con bibliotecas de terceros y configurar sus módulos?

Integre con bibliotecas de terceros y configure sus módulos:

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

import { BrowserModule } from '@angular/platform-browser';

import { SomeThirdPartyModule } from 'some-third-party-library';



@NgModule({

  imports: [

    BrowserModule,

    SomeThirdPartyModule.forRoot()

  ],

  declarations: [AppComponent],

  bootstrap: [AppComponent]

})

export class AppModule { }

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

18. ¿Cómo se utiliza `@Component` de Angular para implementar un componente con decoradores de entrada personalizados y enlaces de propiedades?

Implemente un componente con decoradores de entrada personalizados y enlaces de propiedades:

import { Component, Input, Output, EventEmitter } from '@angular/core';



@Component({

  selector: 'app-custom-input',

  template: `

    <div>

      <p>Input value: {{ value }}</p>

      <button (click)="notify.emit(value)">Notify</button>

    </div>

  `

})

export class CustomInputComponent {

  @Input() value: string;

  @Output() notify = new EventEmitter<string>();

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

19. ¿Cómo se utiliza `@Component` de Angular para crear un componente que interactúa con un servicio WebSocket?

Cree un componente que interactúe con un servicio WebSocket:

import { Component, OnInit, OnDestroy } from '@angular/core';

import { WebSocketService } from './web-socket.service';

import { Subscription } from 'rxjs';



@Component({

  selector: 'app-web-socket',

  template: `

    <div>

      <p>WebSocket Data: {{ data }}</p>

    </div>

  `

})

export class WebSocketComponent implements OnInit, OnDestroy {

  data: string;

  private subscription: Subscription;



  constructor(private webSocketService: WebSocketService) {}



  ngOnInit() {

    this.subscription = this.webSocketService.getData().subscribe(data => {

      this.data = data;

    });

  }



  ngOnDestroy() {

    if (this.subscription) {

      this.subscription.unsubscribe();

    }

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

20. ¿Cómo se utiliza `@Component` de Angular para manejar la carga y renderización dinámica de componentes?

Manejar la carga y renderizado de componentes dinámicos:

import { Component, ViewContainerRef, ComponentFactoryResolver, OnInit } from '@angular/core';

import { DynamicComponent } from './dynamic.component';



@Component({

  selector: 'app-dynamic-loader',

  template: `

    <ng-template #dynamicContainer></ng-template>

    <button (click)="loadComponent()">Load Dynamic Component</button>

  `

})

export class DynamicLoaderComponent implements OnInit {

  @ViewChild('dynamicContainer', { read: ViewContainerRef }) container: ViewContainerRef;



  constructor(private resolver: ComponentFactoryResolver) {}



  ngOnInit() {}



  loadComponent() {

    const factory = this.resolver.resolveComponentFactory(DynamicComponent);

    this.container.clear();

    this.container.createComponent(factory);

  }

}

            

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Bloques de construcción reutilizables y práctica 123 preguntas

Componentes, módulos, servicios, directivas y canalizaciones: cómo diseñar cada uno para que sobreviva en más de una pantalla: alcance, API pública, proyección de contenido, costo de detección de cambios y el punto en el que una pieza compartida deja de amortizarse.

¿Qué hace que un componente Angular sea realmente reutilizable?

Un componente es reutilizable cuando depende de su entradas y salidas, no en una ruta, un almacén global o un servicio del que obtiene datos. Las reglas que aplico:

  • Datos a través @Input (or the newer input() signal), events out through @Output.
  • No HttpClient inside a presentational component; a container component or the caller supplies the data.
  • No hay suposiciones sobre el diseño principal, la ruta o el CSS que lo rodea.
  • Estilos que no se filtran: encapsulación emulada predeterminada más :host for the boundaries.
  • ChangeDetectionStrategy.OnPush, so the host decides when it renders and the component stays cheap.
  • Regiones variables a través de <ng-content> instead de boolean inputs.

Si un componente termina con cinco entradas y tres salidas, generalmente se trata de dos componentes o un servicio que pretende ser uno.

¿Componentes independientes o NgModules para bloques de construcción reutilizables?

Independiente es el valor predeterminado moderno: un componente, directiva o tubería declara exactamente lo que importa, por lo que el consumidor agrega solo lo que usa y la agitación de árboles funciona. NgModules todavía tiene un lugar en una base de código existente y en bibliotecas que necesitan agrupar proveedores o exponer un punto de entrada secundario.

La regla práctica: una API pública por carpeta, exportada a través de un index.ts barrel. If the project keeps NgModules, the shared module contains declarations and exports only — never providers, because a provider imported twice by two lazy features silently creates two instances.

¿Cómo se evita que un módulo compartido se convierta en un vertedero?

Tres condiciones antes de que algo ingrese al depósito compartido: no tiene estado, es utilizado por al menos dos funciones y no depende de ninguna función. Si falla alguno de ellos, permanece en su carpeta de funciones.

  • Sin vocabulario de negocios. un ShipmentStatusBadge is not shared; it is a cargo component. A StatusBadge with a colour input is shared.
  • Sin proveedores. Los singleton pertenecen a core or to providedIn: 'root'.
  • Sin recuperación de datos. En el momento en que necesita una llamada a la API, se convierte en un contenedor y los contenedores son un código de característica.

Un módulo compartido que crece en cada sprint suele ser un síntoma de que las funciones importan las piezas de los demás en lugar de poseerlas.

Componente, directiva o tubería: ¿cómo elegir?

Cada uno existe para resolver un problema diferente y la elección depende de cuál es el resultado:

  • Componente — produce una plantilla. Úselo cuando haya marcado para renderizar.
  • directiva de atributos — cambia el comportamiento o la apariencia de un elemento que ya existe (enfoque, resaltado, permiso, información sobre herramientas). Sin plantilla propia.
  • directiva estructural — decide si se crea una instancia de una plantilla (*appIfLoaded, *appHasRole).
  • Tubería — transforma un valor para su visualización, sin efectos secundarios ni estado.

Regla general: si necesita marcado, un componente; si necesita que el marcado existente se comporte de manera diferente, una directiva; si necesita que un valor existente se muestre de manera diferente, una tubería.

¿Cómo se escribe una directiva de atributo reutilizable?

Una directiva es reutilizable cuando funciona sobre cualquier elemento y toma su configuración como entrada:

@Directive({ selector: '[appHighlightOnHover]', standalone: true })

export class HighlightOnHoverDirective {

  @Input('appHighlightOnHover') color = '#fff59d';



  constructor(private el: ElementRef<HTMLElement>, private r: Renderer2) {}



  @HostListener('mouseenter') onEnter() {

    this.r.setStyle(this.el.nativeElement, 'background', this.color);

  }

  @HostListener('mouseleave') onLeave() {

    this.r.removeStyle(this.el.nativeElement, 'background');

  }

}

Tres detalles que importan: uso Renderer2 instead de writing to nativeElement.style directly (it keeps the directive safe under server-side rendering and in web workers); alias the input with the selector name so [appHighlightOnHover]="'#ffe082'" works; and clean up anything you subscribe to in ngOnDestroy.

¿Cómo se construye una directiva estructural?

Una directiva estructural recibe una TemplateRef and decides whether to instantiate it inside a ViewContainerRef:

@Directive({ selector: '[appIfLoaded]', standalone: true })

export class IfLoadedDirective {

  constructor(private tpl: TemplateRef<unknown>, private vcr: ViewContainerRef) {}



  @Input() set appIfLoaded(loaded: boolean) {

    this.vcr.clear();

    if (loaded) { this.vcr.createEmbeddedView(this.tpl); }

  }

}

la microsintaxis *appIfLoaded="flag" is sugar over an <ng-template> binding, which is why the input has to be named after the selector. Clearing before creating avoids duplicated views when the value flips, and the same pattern scales to permission checks or feature flags.

¿Qué hace que un servicio sea reutilizable y tenga alcance raíz versus componente?

Un servicio reutilizable tiene una responsabilidad, no tiene conocimiento de la interfaz de usuario y cada dependencia se inyecta en lugar de importarse directamente. El alcance es una decisión del ciclo de vida, no una preferencia de estilo:

  • providedIn: 'root' — one instance for the application, tree-shaken away if nobody injects it. Correct for gateways, configuration and stateless helpers.
  • providers: [...] on a component — a fresh instance per component instance. Correct for wizard state, an editable form model, anything that must not leak between two open screens.
  • Los proveedores declarados en una característica de carga diferida tienen como alcance esa característica; cargarlo dos veces crearía dos copias.

Un servicio raíz que contiene datos por pantalla es la fuga clásica: la segunda pantalla lee los restos de la primera.

¿Cómo se puede hacer que un servicio sea sustituible en pruebas y entre implementaciones?

Depende de un token de inyección escrito en una interfaz en lugar de una clase concreta:

export interface PricingGateway {

  quote(command: QuoteCommand): Observable<Quote>;

}



export const PRICING_GATEWAY =

  new InjectionToken<PricingGateway>('PRICING_GATEWAY');

El módulo decide si la aplicación recibe la implementación HTTP, un simulacro o un decorador de almacenamiento en caché. La biblioteca reutilizable ya no importa HttpClient, consumers can swap REST for GraphQL without touching call sites, and tests provide a three-line fake instead de an HTTP harness.

Tuberías puras versus impuras: ¿cuál es la diferencia y cuándo importa?

un puro la tubería se llama solo cuando cambia la referencia de entrada; Angular almacena en caché el resultado por entrada. un impuro tubería (pure: false) runs on every change-detection cycle.

Esa diferencia es una decisión de rendimiento: una clasificación o filtro impuro sobre una larga lista dentro *ngFor re-runs dozens de times per second, and it also defeats memoisation, because every run produces a new array reference. Sorting, filtering and mapping belong in the component or a computed signal; pipes are for formatting — dates, currency, weights, translation — where the transformation is cheap and deterministic.

¿Cómo se escribe una pipa personalizada y cómo se mantiene reutilizable?

@Pipe({ name: 'weight', standalone: true })

export class WeightPipe implements PipeTransform {

  transform(value: number | null, unit: 'kg' | 'lb' = 'kg'): string {

    if (value === null || value === undefined) { return '—'; }

    return unit === 'kg'

      ? value.toFixed(1) + ' kg'

      : (value * 2.20462).toFixed(1) + ' lb';

  }

}

Manténgalo puro, manténgalo libre de singletons inyectados (una tubería con una dependencia es difícil de probar y de reutilizar), hágala segura para nulos y tome la configuración como argumentos para que una tubería cubra varios casos en lugar de cinco casi duplicados. Márquelo como independiente y expórtelo desde el barril de carpetas para que los consumidores lo importen sin un módulo.

¿Cómo la proyección de contenido hace que un componente sea reutilizable?

<ng-content> moves the decision about the inner markup to the caller, which removes flags like [showFooter]:

<app-card>

  <h3 card-title>AWB 020-12345678</h3>

  <p>Booked, awaiting cut-off</p>

  <button card-actions>Rebook</button>

</app-card>

Dentro de la tarjeta: <ng-content select="[card-title]">, <ng-content select="[card-actions]"> and a plain <ng-content> as the fallback slot. When the parent has to supply a template that the child renders in its own context — a table cell, a list item — use <ng-template> plus ngTemplateOutlet with a context object instead de projecting markup.

¿Cómo se mantiene estable la API pública de un componente reutilizable?

Trate los insumos y productos como un contrato con los consumidores:

  • Los insumos requeridos siguen siendo requeridos (input.required or a validation in ngOnInit), optional ones have a documented default.
  • Nunca mute un objeto recibido a través de una entrada; emitir uno nuevo. Combinado con OnPush, this is what makes the component predictable.
  • No cambie el nombre ni elimine una entrada sin un período de desuso y no filtre tipos internos en la firma.
  • Exponer el comportamiento a través de resultados y métodos, nunca permitiendo que los padres lleguen al estado interno.
  • Si otros equipos lo consumen, publíquelo como una biblioteca (ng-packagr, puntos de entrada secundarios, semver) y mantenga una ruta de demostración o Storybook como documentación viva.

¿Cómo se prueban componentes, directivas y tuberías reutilizables?

  • Tubería - una función pura: crear una instancia y afirmar la entrada/salida, incluidos los casos nulos y extremos.
  • Directiva — un componente anfitrión en TestBed that uses the directive on a real element; assert the DOM change and the cleanup.
  • Componente — un componente de host que proporciona entradas y registra salidas, además de afirmaciones DOM sobre lo que ve el usuario; una prueba por rama de la API pública, no por método interno.
  • Contrato – una prueba en tiempo de compilación que importa solo del barril público, por lo que una refactorización que interrumpe a los consumidores falla en la compilación en lugar de en una pantalla.

Si un componente reutilizable necesita HttpTestingController to be tested, it is not reusable yet: the data dependency belongs one level up.

¿Cuándo no vale la pena volver a utilizar un componente?

Cuando tiene una única persona que llama y no hay un segundo caso de uso a la vista. La abstracción prematura cuesta más que la duplicación: un componente con un mode enum switching three templates, or five inputs where two are always passed together, is a sign that two screens were merged.

La regla que uso es duplicar una vez y extraer la tercera vez, cuando personas reales prueban la forma. El código extraído después de tres usos reales tiende a sobrevivir; El código extraído de antemano generalmente recibe una cuarta entrada booleana y un comentario que lo explica.

Práctica complementaria: Angular moderno

1012. ¿Cómo se aplica signals en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1013. ¿Cómo se aplica computed en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1014. ¿Cómo se aplica effect en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1015. ¿Cómo se aplica input signals en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1016. ¿Cómo se aplica output en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1017. ¿Cómo se aplica model inputs en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1018. ¿Cómo se aplica viewChild signal en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1019. ¿Cómo se aplica contentChild signal en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1020. ¿Cómo se aplica afterNextRender en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1021. ¿Cómo se aplica afterEveryRender en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1022. ¿Cómo se aplica DestroyRef en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

providers: [{ provide: API_URL, useValue: '/api' }]

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1023. ¿Cómo se aplica takeUntilDestroyed en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1024. ¿Cómo se aplica provideRouter en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1025. ¿Cómo se aplica provideHttpClient en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1026. ¿Cómo se aplica withInterceptors en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1027. ¿Cómo se aplica withFetch en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1028. ¿Cómo se aplica provideClientHydration en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1029. ¿Cómo se aplica withEventReplay en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1030. ¿Cómo se aplica provideZoneChangeDetection en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1031. ¿Cómo se aplica zoneless en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1032. ¿Cómo se aplica @defer en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1033. ¿Cómo se aplica @placeholder en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

providers: [{ provide: API_URL, useValue: '/api' }]

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1034. ¿Cómo se aplica @loading en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1035. ¿Cómo se aplica @error en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1036. ¿Cómo se aplica @for track en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1037. ¿Cómo se aplica @empty en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1038. ¿Cómo se aplica @switch en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1039. ¿Cómo se aplica @let en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1040. ¿Cómo se aplica standalone component en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1041. ¿Cómo se aplica lazy route en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1042. ¿Cómo se aplica loadComponent en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1043. ¿Cómo se aplica route providers en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1044. ¿Cómo se aplica canMatch en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

providers: [{ provide: API_URL, useValue: '/api' }]

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1045. ¿Cómo se aplica canDeactivate en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1046. ¿Cómo se aplica resolve en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1047. ¿Cómo se aplica typed reactive forms en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1048. ¿Cómo se aplica nonNullable forms en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1049. ¿Cómo se aplica FormRecord en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1050. ¿Cómo se aplica ControlValueAccessor en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1051. ¿Cómo se aplica async validator en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1052. ¿Cómo se aplica cross-field validator en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1053. ¿Cómo se aplica HttpContext en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1054. ¿Cómo se aplica functional interceptor en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1055. ¿Cómo se aplica retry en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

providers: [{ provide: API_URL, useValue: '/api' }]

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1056. ¿Cómo se aplica timeout en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1057. ¿Cómo se aplica http resource en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1058. ¿Cómo se aplica transfer cache en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1059. ¿Cómo se aplica OnPush en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1060. ¿Cómo se aplica markForCheck en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1061. ¿Cómo se aplica detach en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1062. ¿Cómo se aplica trackBy en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1063. ¿Cómo se aplica CDK virtual scroll en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1064. ¿Cómo se aplica Angular DevTools en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1065. ¿Cómo se aplica SSR en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1066. ¿Cómo se aplica hydration en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

providers: [{ provide: API_URL, useValue: '/api' }]

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1067. ¿Cómo se aplica incremental hydration en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1068. ¿Cómo se aplica prerender en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1069. ¿Cómo se aplica server routes en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1070. ¿Cómo se aplica app shell en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1071. ¿Cómo se aplica NgOptimizedImage en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1072. ¿Cómo se aplica image priority en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1073. ¿Cómo se aplica bundle budget en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1074. ¿Cómo se aplica source maps en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1075. ¿Cómo se aplica production build en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1076. ¿Cómo se aplica esbuild en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1077. ¿Cómo se aplica TestBed en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

providers: [{ provide: API_URL, useValue: '/api' }]

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1078. ¿Cómo se aplica ComponentFixture en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1079. ¿Cómo se aplica fakeAsync en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1080. ¿Cómo se aplica HttpTestingController en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1081. ¿Cómo se aplica router testing en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1082. ¿Cómo se aplica harnesses en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1083. ¿Cómo se aplica accessibility en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1084. ¿Cómo se aplica ARIA en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1085. ¿Cómo se aplica focus management en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1086. ¿Cómo se aplica keyboard navigation en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1087. ¿Cómo se aplica i18n en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1088. ¿Cómo se aplica localized formats en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

providers: [{ provide: API_URL, useValue: '/api' }]

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1089. ¿Cómo se aplica service worker en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1090. ¿Cómo se aplica application cache en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1091. ¿Cómo se aplica offline update en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1092. ¿Cómo se aplica web worker en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1093. ¿Cómo se aplica security en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1094. ¿Cómo se aplica DOM sanitization en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1095. ¿Cómo se aplica InjectionToken en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1096. ¿Cómo se aplica factory provider en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1097. ¿Cómo se aplica multi provider en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1098. ¿Cómo se aplica environment injector en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1099. ¿Cómo se aplica host directive en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

providers: [{ provide: API_URL, useValue: '/api' }]

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1100. ¿Cómo se aplica content projection en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1101. ¿Cómo se aplica library API en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1102. ¿Cómo se aplica secondary entry point en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1103. ¿Cómo se aplica schematics en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1104. ¿Cómo se aplica Angular migrations en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1105. ¿Cómo se aplica ESLint en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1106. ¿Cómo se aplica strict templates en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1107. ¿Cómo se aplica error handler en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1108. ¿Cómo se aplica global loading en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1109. ¿Cómo se aplica telemetry en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1110. ¿Cómo se aplica feature flags en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

providers: [{ provide: API_URL, useValue: '/api' }]

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1111. ¿Cómo se aplica runtime configuration en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly value = signal(0);

readonly doubled = computed(() => this.value() * 2);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1112. ¿Cómo se aplica CI pipeline en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

readonly data = toSignal(this.api.load(), { initialValue: [] });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1113. ¿Cómo se aplica monorepo en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideRouter(routes, withComponentInputBinding())

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1114. ¿Cómo se aplica Nx en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

provideHttpClient(withInterceptors([authInterceptor]))

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1115. ¿Cómo se aplica module federation en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

@defer (on viewport) { <app-chart /> } @placeholder { <p>Cargando…</p> }

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1116. ¿Cómo se aplica micro frontends en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

items = this.fb.nonNullable.array<string>([]);

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1117. ¿Cómo se aplica state management en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

return next(req).pipe(timeout(8000), retry({ count: 2 }));

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1118. ¿Cómo se aplica NgRx signals en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

changeDetection: ChangeDetectionStrategy.OnPush

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1119. ¿Cómo se aplica resource API en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

<img ngSrc="/banner.webp" width="1200" height="600" priority>

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.

1120. ¿Cómo se aplica Angular Material en una aplicación Angular moderna?

Úselo cuando aporte una responsabilidad clara a la característica. Defina un contrato tipado, limite su alcance y cubra el flujo principal y los errores con pruebas. La API concreta depende de la versión de Angular y del contexto de la aplicación.

it('muestra los datos', () => { fixture.detectChanges(); expect(el.textContent).toContain('OK'); });

Nota práctica: En la práctica, aplíquelo con una responsabilidad bien delimitada, tipos explícitos y pruebas que cubran el caso correcto y los errores esperados. Evite acoplar esta decisión a detalles de la interfaz o de infraestructura; así el código será más fácil de mantener, reutilizar y evolucionar cuando cambien los requisitos de la aplicación.