Items
Los Items son clases que extienden ReactiveModel y representan entidades individuales dentro de una aplicación reactiva. Cada item representa una entidad identificable (como un usuario, producto, post, etc.) que puede cargarse, guardarse, eliminarse y gestionarse de forma reactiva.
🎯 ¿Qué es un Item?
Un Item es una clase reactiva que:
Extiende
ReactiveModelpara obtener capacidades de reactividadSe integra con un sistema de registro (registry) para persistir y rastrear su estado
Puede trabajar con proveedores de datos (providers) para cargar y guardar información
Gestiona automáticamente su ciclo de vida (carga, publicación, eliminación)
🧩 Herencia
Item<T, P> extends ReactiveModel<T>T: Interfaz que define las propiedades del itemP: Clase del proveedor que implementaIEntityProvider
📦 Constructor
new Item({
entity: string, // Nombre de la entidad (requerido)
provider?: class, // Clase del proveedor (opcional)
properties: string[], // Array de nombres de propiedades reactivas
id?: string | number, // ID inicial del item (opcional)
...initialValues // Valores iniciales adicionales
})Parámetros
entity: (requerido) Nombre de la entidad del dominio (usado para el registro)provider: (opcional) Clase que implementaIEntityProviderproperties: Array de nombres de propiedades que serán reactivasid: ID inicial del item (opcional)initialValues: Valores iniciales adicionales para las propiedades
🔑 Propiedades Principales
entity
string
Nombre de la entidad (ej: 'user')
registry
Registry
Gestor interno del registro
provider
object
Instancia del proveedor de datos (opcional)
fetched
boolean
true si load() fue exitoso
found
boolean
true si el registro fue encontrado al cargar
draft
boolean
true si el item aún es un borrador
deleted
boolean
true si el item ha sido eliminado
__registryState
string
Estado del registro: 'draft', 'published' o 'deleted'
__instanceId
string
ID interno de la instancia para rastreo
⚙️ Métodos Principales
load(args?): Promise<any>
load(args?): Promise<any>Carga el item utilizando el método load() del proveedor asociado. Actualiza el estado interno con los datos obtenidos y emite eventos "load" y "change".
Ejemplo:
Parámetros:
args: Argumentos opcionales que se pasan al proveedor
Retorna:
Promise<any>: Los datos cargados del proveedor
Errores:
Lanza un error si el proveedor no está definido o no implementa
load()Lanza un error si el proveedor no retorna un item
publish(data?): Promise<T>
publish(data?): Promise<T>Guarda los cambios del item. Actualiza el estado del registro y llama al método publish() del proveedor (si está implementado). Guarda los cambios como initialValues internamente.
Ejemplo:
Con datos específicos:
Parámetros:
data: Datos opcionales para publicar (si no se proporciona, usa los valores actuales)
Retorna:
Promise<T>: Los datos publicados
Errores:
Lanza un error si la publicación falla
delete(options?): Promise<boolean>
delete(options?): Promise<boolean>Elimina el item mediante el método delete() del proveedor y marca el item como eliminado en el registro.
Ejemplo:
Omitiendo el proveedor:
Parámetros:
options.skipProvider: Si estrue, no llama al proveedor para eliminar
Retorna:
Promise<boolean>:truesi la eliminación fue exitosa
set(values: Partial<T>): SetPropertiesResult
set(values: Partial<T>): SetPropertiesResultSobrescribe el método de Model para actualizar valores y sincronizarlos con el registro. Dispara el evento set.executed.
Ejemplo:
🔄 Eventos
Los items emiten varios eventos que puedes escuchar:
set.executed
Después de que se llama al método set()
change
En cualquier actualización de propiedad
load
Después de un load() exitoso
<prop>.changed
Cuando una propiedad reactiva específica cambia
Ejemplo de uso de eventos:
🛠 Proveedor (Provider)
Para habilitar la carga, publicación o eliminación de datos, debes pasar una clase que implemente IEntityProvider:
Ejemplo de Proveedor
📝 Ejemplo Completo
🔍 Características Avanzadas
Registro (Registry)
Los items se integran automáticamente con un sistema de registro que mantiene el estado de todas las instancias. Esto permite:
Sincronización entre múltiples instancias del mismo item
Rastreo del estado (draft, published, deleted)
Gestión automática de cambios
Propiedades Reactivas
Solo las propiedades especificadas en el array properties son reactivas. Cualquier cambio en estas propiedades:
Dispara el evento
<propiedad>.changedActualiza el registro automáticamente
Dispara el evento
change
Estado de Carga
El item mantiene información sobre su estado de carga:
fetched: Indica si se ha intentado cargar el itemfound: Indica si el item fue encontrado en la última cargafetching: Indica si actualmente se está cargando (heredado deReactiveModel)
🔗 Propiedades Anidadas
Los Items pueden tener otros Items o Collections como propiedades anidadas. Esto es útil para modelar relaciones entre entidades.
Ejemplo rápido:
Para más información sobre cómo implementar propiedades anidadas, consulta la documentación completa de Propiedades Anidadas.
🎓 Mejores Prácticas
Siempre define las propiedades reactivas: Especifica todas las propiedades que necesitas en el array
propertiesUsa TypeScript: Define interfaces para tus items para obtener autocompletado y verificación de tipos
Maneja errores: Siempre envuelve las llamadas a
load(),publish()ydelete()en try/catchEscucha eventos: Usa eventos para reaccionar a cambios sin necesidad de polling
Reutiliza proveedores: Crea proveedores reutilizables que puedan ser compartidos entre diferentes items similares
⚠️ Errores Comunes
Error: "Entity is required"
Error: "Provider must be a class/constructor"
Error: "DataProvider is not defined or does not implement the load() method"
Last updated