Diálogo modal Angular 2
- ¿Qué es el diálogo modal en Angular 2?
- Importe las bibliotecas para crear un diálogo modal en Angular 2
- Servicio modal para crear un diálogo modal en Angular 2
- Componente modal personalizado para crear un cuadro de diálogo modal en 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:
- Para solicitar al usuario una entrada.
- Para mostrar mensajes o notificaciones importantes.
- 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.
- Agregue las bibliotecas
- Servicios Modales
- 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 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