libs/suspense/types/suspenseable-broadcaster.ts
Definición de clase abstracta para la implementación de un componente Suspenseable
cuya operación de en modo "reactivo", es decir basada en la captura de eventos que indiquen
cuando el componente está listo para ser desplegado o cuando se ha producido un error.
Sólo fuerza la definición del método eventHandler()
, que debe definir el nombre del evento
a capturar.
El componente se despliega una vez recibido el evento <eventName>:load
:
<suspense>
<ng-template [defaultView]="compFactory" [componentParams]="compParams" clazzName="CompComponent" onEvent="comp"></ng-template>
<ng-template fallbackView><qp-suspense-spinner>Cargando Comp...</qp-suspense-spinner></ng-template>
<ng-template errorView><qp-suspense-error>Falló carga de Comp</qp-suspense-error></ng-template>
</suspense>
El nombre del evento debe ser el mismo que el nombre del componente SuspenseableBroadcaster, sin el sufijo "Component";
y debe ser indicado como el @Input() onEvent
del componente.
Si se especifica onEvent con algún error, el componente no se desplegará y el mensaje de error indicará la corrección a realizar.
En este modo, una vez que el componente realice las operaciones que lo disponibilizan para ser desplegado, se deberá incluir la
correspondiente llamada al método this.broadcastLoad()
.
Análogamente, en caso de error se deberá llamar al método this.broadcastError()
.
Pick
Propiedades |
Métodos |
Opcional eventName |
Tipo : string
|
Nombre del evento a capturar, en caso de operar en modo "reactivo" |
eventService |
Tipo : EventService
|
Valor por defecto : inject(EVENT_SERVICE)
|
Servicio de eventos, requerido para el modo de operación "reactivo" |
defaultDisplay |
Tipo : string
|
Valor por defecto : 'inherit'
|
Heredado desde
SuspenseableRenderer
|
Definido en
SuspenseableRenderer:92
|
elementRef |
Tipo : ElementRef
|
Valor por defecto : inject(ElementRef)
|
Heredado desde
SuspenseableRenderer
|
Definido en
SuspenseableRenderer:89
|
platformId |
Tipo : Object
|
Valor por defecto : inject(PLATFORM_ID)
|
Heredado desde
SuspenseableRenderer
|
Definido en
SuspenseableRenderer:90
|
renderer |
Tipo : Renderer2
|
Valor por defecto : inject(Renderer2)
|
Heredado desde
SuspenseableRenderer
|
Definido en
SuspenseableRenderer:88
|
broadcastError |
broadcastError()
|
Devuelve :
void
|
broadcastLoad |
broadcastLoad()
|
Devuelve :
void
|
Abstract eventHandler | ||||||
eventHandler(eventName: string)
|
||||||
Parámetros :
Devuelve :
void
|
renderComponenteReady |
renderComponenteReady()
|
Heredado desde
SuspenseableRenderer
|
Definido en
SuspenseableRenderer:110
|
En caso que la operación sea desde dentro de un browser, se cambia el valor de
Devuelve :
void
|
import { inject } from "@angular/core";
import { EventService } from "@queplan/qp-suspense/services";
import { EVENT_SERVICE, ISuspenseable, SuspenseableRenderer } from "./types";
/**
* Definición de clase abstracta para la implementación de un componente Suspenseable
* cuya operación de en modo "reactivo", es decir basada en la captura de eventos que indiquen
* cuando el componente está listo para ser desplegado o cuando se ha producido un error.
* Sólo fuerza la definición del método `eventHandler()`, que debe definir el nombre del evento
* a capturar.
*
* Modo reactivo
* ----------------
*
* El componente se despliega una vez recibido el evento `<eventName>:load`:
*
* ```
* <suspense>
* <ng-template [defaultView]="compFactory" [componentParams]="compParams" clazzName="CompComponent" onEvent="comp"></ng-template>
*
* <ng-template fallbackView><qp-suspense-spinner>Cargando Comp...</qp-suspense-spinner></ng-template>
* <ng-template errorView><qp-suspense-error>Falló carga de Comp</qp-suspense-error></ng-template>
* </suspense>
* ```
*
* El nombre del evento debe ser el mismo que el nombre del componente SuspenseableBroadcaster, sin el sufijo "Component";
* y debe ser indicado como el @Input() `onEvent` del componente.
* Si se especifica onEvent con algún error, el componente no se desplegará y el mensaje de error indicará la corrección a realizar.
* En este modo, una vez que el componente realice las operaciones que lo disponibilizan para ser desplegado, se deberá incluir la
* correspondiente llamada al método `this.broadcastLoad()`.
* Análogamente, en caso de error se deberá llamar al método `this.broadcastError()`.
*/
export abstract class SuspenseableBroadcaster extends SuspenseableRenderer implements Pick<ISuspenseable, 'eventHandler' | 'broadcastLoad' | 'broadcastError'> {
/**
* Servicio de eventos, requerido para el modo de operación "reactivo"
*/
eventService : EventService = inject(EVENT_SERVICE);
/**
* Nombre del evento a capturar, en caso de operar en modo "reactivo"
*/
eventName ?: string;
abstract eventHandler(eventName: string): void;
broadcastLoad(): void {
/**
* Sólo notifica el estado en caso de estar operando en modo "reactivo"
*/
if (this.eventName) {
this.renderComponenteReady();
this.eventService.broadcast(`${this.eventName}:load`, true);
} else {
throw new Error('Usando modo reactivo sin haber defido el nombre del evento. Verifique implementación de eventHandler()');
}
}
broadcastError(): void {
/**
* Sólo notifica el estado en caso de estar operando en modo "reactivo"
*/
if (this.eventName) {
this.renderComponenteReady();
this.eventService.broadcast(`${this.eventName}:error`, true);
} else {
throw new Error('Usando modo reactivo sin haber defido el nombre del evento. Verifique implementación de eventHandler()');
}
}
}