Diálogo modal Angular 2

Muhammad Adil 30 enero 2023
  1. ¿Qué es el diálogo modal en Angular 2?
  2. Importe las bibliotecas para crear un diálogo modal en Angular 2
  3. Servicio modal para crear un diálogo modal en Angular 2
  4. Componente modal personalizado para crear un cuadro de diálogo modal en Angular 2
Diálogo modal Angular 2

Angular 2.0 es la última versión del popular marco de JavaScript. Proporciona a los desarrolladores una nueva arquitectura basada en componentes, es compatible con dispositivos móviles y está escrito en TypeScript.

Los diálogos modales son ventanas que aparecen encima de la ventana actual y bloquean la interacción hasta que se cierran. Este artículo explicará en detalle el diálogo modal de Angular 2.0.

¿Qué es el diálogo modal en Angular 2?

Para ayudar a los desarrolladores a crear aplicaciones web más dinámicas e interactivas, Angular 2.0 introdujo un nuevo componente llamado Modal Dialog.

Los términos diálogo modal y ventana modal pueden parecer confusos, pero no lo son. La mayoría de la gente se refiere a una ventana modal como una ventana emergente por defecto.

El diálogo modal permite a los desarrolladores crear una variedad de diálogos con contenido y animaciones enriquecidos. Se puede utilizar de diferentes maneras, por ejemplo:

  1. Para solicitar al usuario una entrada.
  2. Para mostrar mensajes o notificaciones importantes.
  3. Para mostrar mensajes de error o mensajes de confirmación.

Haga clic aquí si desea obtener más información sobre el diálogo modal.

Dividamos nuestro trabajo en lo siguiente para simplificar.

  1. Agregue las bibliotecas
  2. Servicios Modales
  3. Componente modal

Para propósitos de estilo, usamos Bootstrap.

Importe las bibliotecas para crear un diálogo modal en Angular 2

Importe las siguientes bibliotecas en el archivo index.html para mejorar la funcionalidad de su código.

<script src="https://npmcdn.com/core-js/client/shim.min.js"></script>
        <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">

    <script src="https://npmcdn.com/zone.js@0.6.12?main=browser"></script>
    <script src="https://npmcdn.com/reflect-metadata@0.1.3"></script>
    <script src="https://npmcdn.com/systemjs@0.19.27/dist/system.src.js"></script>

Después de esto, nuestra principal preocupación es compilar el código. No puede compilar cosas directamente en el DOM con Angular 2; necesitas un marcador de posición.

Es por eso que hicimos un marcador de posición modal. Tenga en cuenta que este es el paso más importante para empezar.

@Component({
    selector: "modal-placeholder",
    template: `<div #modalplaceholder></div>`
})
export class ModalPlaceholderComponent implements OnInit {
    @ViewChild("modalplaceholder", {read: ViewContainerRef}) viewContainerRef;

Servicio modal para crear un diálogo modal en Angular 2

Nos dirigimos hacia el segundo paso, también llamado paso raíz. El objetivo principal del servicio modal es facilitar la comunicación entre los componentes modales y en la página.

El servicio modal también realiza un seguimiento de qué modales en la página están disponibles y cómo interactuar con ellos.

import {Component,NgModule, ViewChild, OnInit, ViewContainerRef, Compiler, ReflectiveInjector, Injectable, Injector, ComponentRef} from "@angular/core";
import {Observable, Subject, BehaviorSubject, ReplaySubject} from "rxjs/Rx";

@Injectable()
export class ModalService {
    private vcRef: ViewContainerRef;
    private injector: Injector;
    public activeInstances: number;

    constructor(private compiler: Compiler) {
    }

    registerViewContainerRef(vcRef: ViewContainerRef): void {
        this.vcRef = vcRef;
    }

    registerInjector(injector: Injector): void {
        this.injector = injector;
    }

    create<T>(module: any, component: any, parameters?: Object): Observable<ComponentRef<T>> {
        let componentRef$ = new ReplaySubject();
        this.compiler.compileModuleAndAllComponentsAsync(module)
            .then(factory => {
                let componentFactory = factory.componentFactories.filter(item => item.componentType === component)[0];
                const childInjector = ReflectiveInjector.resolveAndCreate([], this.injector);
                let componentRef = this.vcRef.createComponent(componentFactory, 0, childInjector);
                Object.assign(componentRef.instance, parameters);
                this.activeInstances ++;
                componentRef.instance["com"] = this.activeInstances;
                componentRef.instance["destroy"] = () => {
                    this.activeInstances --;
                    componentRef.destroy();
                };
                componentRef$.next(componentRef);
                componentRef$.complete();
            });
        return <Observable<ComponentRef<T>>> componentRef$.asObservable();
    }
}

@Component({
    selector: "modal-placeholder",
    template: `<div #modalplaceholder></div>`
})
export class ModalPlaceholderComponent implements OnInit {
    @ViewChild("modalplaceholder", {read: ViewContainerRef}) viewContainerRef;

    constructor(private modalService: ModalService, private injector: Injector) {

    }
    ngOnInit(): void {
        this.modalService.registerViewContainerRef(this.viewContainerRef);
        this.modalService.registerInjector(this.injector);
    }
}


@NgModule({
    declarations: [ModalPlaceholderComponent],
    exports: [ModalPlaceholderComponent],
    providers: [ModalService]
})
export class ModalModule {
}

export class ModalContainer {
    destroy: Function;
    componentIndex: number;
    closeModal(): void {
        this.destroy();
    }
}
export function Modal() {
    return function (world) {
        Object.assign(world.prototype,  ModalContainer.prototype);
    };
}

¿Qué es RxJS?

RxJS (Extensiones reactivas para JavaScript) es un conjunto de módulos que le permiten crear programas asincrónicos y basados ​​en eventos en JavaScript utilizando arreglos y composición visibles.

Componente modal personalizado para crear un cuadro de diálogo modal en Angular 2

La directiva modal personalizada puede agregar modales en una aplicación Angular usando la etiqueta <modal>.

Cuando se carga una instancia modal, se registra con ModalService para que el servicio pueda abrir y cerrar ventanas modales. Se da de baja del ModalService cuando se destruye usando el método Destroy.

import {Modal} from "./modal.module";
import {Component} from "@angular/core";
@Component({
    selector: "my-cust",
    template: `
        <h1>Basic Components of a Car</h1>
        <button (click)="onDelete()">×</button>
        <ul>
          <li *ngFor="let option of options">{{option}}</li>
        </ul>
        <div>
            <button (click)="onDelete()">
                <span>Delete</span>
            </button>
            <button (click)="onSave()">
                <span>Save</span>
            </button>
        </div>
`
})
@Modal()
export class ModalComponent {
    ok: Function;
    destroy: Function;
    closeModal: Function;
    options = ["Speed", "Mileage", "Color"];

    onDelete(): void{
        this.closeModal();
        this.destroy();
    }

    onSave(): void{
        this.closeModal();
        this.destroy();
        this.ok(this.options);
    }
}

Finalmente, el código index.html se proporciona a continuación.

<!DOCTYPE html>
<html>
  <head>
    <title>Angular 2 QuickStart</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- 1. Load libraries -->
     <!-- Polyfill(s) for older browsers -->
    <script src="https://npmcdn.com/core-js/client/shim.min.js"></script>
        <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">

    <script src="https://npmcdn.com/zone.js@0.6.12?main=browser"></script>
    <script src="https://npmcdn.com/reflect-metadata@0.1.3"></script>
    <script src="https://npmcdn.com/systemjs@0.19.27/dist/system.src.js"></script>

    <!-- 2. Configure SystemJS -->
    <script src="config.js"></script>
    <script>
      System.import('app').catch(function(err){ console.error(err); });
    </script>
  </head>

  <body>
    <my-hoop>Loading...</my-hoop>
  </body>
</html>

Entonces, esta es la forma de crear un modal en Angular 2. El código es mantenible, flexible y fácil de usar. Haga clic aquí para ver la demostración en vivo del código.

Muhammad Adil avatar Muhammad Adil avatar

Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.

Facebook

Artículo relacionado - Angular Modal