Como continuación del
artículo anterior sobre el estado general de los componentes , desarrollaré más el tema y quiero implementar una función que detecte y procese un evento de cambio de estado en cada componente (cuando los datos en estado general cambian en algún componente).
Enlace al proyectoPor lo general, para rastrear los cambios de datos en un componente, se crea una conexión directa, es decir, verificamos en el método de Actualización si los datos han cambiado allí.
Verificación previa de datos a través del método de actualizacióno nos suscribimos a un evento muy específico, que se activa de forma independiente en el componente "rastreado" y finalmente se procesa.
Suscribirse a un evento en un componente y procesarloHay muchas deficiencias en este enfoque, que se describen principalmente en un artículo anterior. La principal razón común de estas deficiencias es una fuerte coherencia y mantenimiento complejo (la capacidad de apoyar, desarrollar un proyecto y refactorizar).
Crear una solución de notificación estatal
Ahora que tiene un sistema que le permite aflojar la conexión entre los componentes y los medios para crear correos entre los componentes, puede deshacerse de la verificación manual de valores en condiciones generales, de la siguiente manera:
Esquema general de notificación de cambio de estadoEn la implementación descrita en el artículo anterior, los datos se cambian en un lugar, en el indexador del componente SharedState, y por lo tanto es muy simple controlar su cambio.
Indexador en estado generalEn el setter del indexador, asignamos valores de estado.
Ahora, para el componente
SharedState , debe agregar una dependencia en
SharedEvents , ya que lo
usaré para enviar notificaciones. Añadir atributo para
SharedState.
Agregar una dependencia SharedState de SharedEventsY cree una clase que herede de EventData para enviar datos en una notificación de estado. Contendrá el nombre del parámetro, en estado y su nuevo valor
Agregar una clase que contiene información sobre un cambio en el estado generalAhora necesita agregar un enlace a
SharedEvents , obteniéndolo del objeto del juego en el componente
SharedState
Obtener eventos compartidos en un componente SharedStateAhora cambiaremos la configuración del indexador para que cada vez que cambie el estado, se cree una notificación con el nombre "sharedstatechanged" y pasemos un objeto que contenga todos los datos sobre el cambio
Cambiar el configurador del indexadorAhora queda suscribirse a los cambios en un componente, cambiar los datos en otro y verificar cómo funciona.
Digamos que
SecondComponent cambia de estado, por ejemplo, el parámetro "somedata", y el componente
FirstComponent monitorea el cambio de estado suscribiéndose a notificaciones
En
SecondComponent, llamamos al cambio de parámetro
Cambiar llamada de datosY ahora en el método
FirstComponent agregamos un controlador e
imprimimos información sobre el cambio en el estado general de la consola
Manejo de eventos de cambio de estado generalAhora, si inicia el juego, después de cambiar el estado general en
SecondComponent , en el componente
FirstComponent recibiremos una notificación y enviaremos los datos a la consola.

Ahora que esto funciona, puede refactorizar un poco y hacer que el código sea aún más conveniente. Para hacer esto, debe transferir la suscripción para notificaciones de cambios en el estado general a la clase base
SharedStateComponent y crear un método abstracto, mediante la implementación de que cada componente procesará los cambios de estado en él o no, a discreción del componente.
Transferir una suscripción a
SharedStateComponent
Suscribirse a notificaciones de cambios en el estado general en la clase baseAgregue un método abstracto y llámelo en el controlador de eventos
Agregar un método abstracto para manejar el evento en clases secundariasY ahora, en cada componente secundario de
FirstComponent y
SecondComponent, debe implementar este método y procesar el cambio en el estado general. Pero solo lo imprimiremos en la consola como antes
Implementación de un método abstracto en componentes FirstComponent y SecondComponentY ahora, cuando comenzamos el juego, veremos 2 entradas en la consola, de ambos componentes.

Importante!
En la implementación anterior, había un error en la clase
SharedEvents, y para solucionarlo, debe cambiar el método de
suscripción a:
