underscore template backbonejs javascript model-view-controller backbone.js

javascript - template - backbonejs github



Backbone.js: ¿dónde almacenar información del estado? (2)

Soy nuevo en Backbone.js , y estoy tratando de averiguar dónde deberían vivir las variables de estado . Mi caso de uso:

Tengo una aplicación que proporciona una interfaz de lectura para un libro (lo sé, ejemplo clásico, ¿verdad?). Mis modelos son Book y Page con clases de colección para cada uno. La estructura de la aplicación se ve más o menos así (perdona la visio ASCII):

+------------+ | Controller | +------------+ | Views Models | +--------------+ +----------------+ |-| IndexView |------| BookCollection | | +--------------+ +----------------+ | | | +--------------+ +----------------+ +-| BookView |------| Book | +--------------+ +----------------+ | | | +--------------+ | |-| TitleView |-+ | | +--------------+ | +----------------+ | +-| Page | | +--------------+ | +----------------+ +-| PageView |-+ +--------------+

Es decir, el Controller ejemplifica y coordina dos vistas, IndexView y BookView , respaldadas por los modelos. BookView instancia y coordina un conjunto de subvistas (en realidad hay más de lo que se muestra aquí).

La información del estado incluye:

  • el libro actual (puntero o identificación)
  • la página actual (puntero o ID)
  • otras variables de estado de IU, como si las imágenes en la página son visibles o no, si otros widgets están abiertos o cerrados, etc.

Mi pregunta es, ¿dónde debería vivir esta información de estado? Las posibles opciones incluyen:

  • Los modelos , que podrían ser conscientes del estado. Esto tiene sentido, ya que están destinados a almacenar datos y las vistas pueden escuchar cambios de estado, pero no parece que esto se ajuste al patrón de Backbone.js deseado, y no siempre tendría sentido (por ejemplo, activar la imagen en el PageView debe aplicarse a todas las páginas, no solo a la actual)

  • Un modelo singleton especial destinado a contener información de estado. Nuevamente, tiene sentido, es fácil de escuchar, todos los puntos de vista podrían vincularse a él, pero de nuevo, esto parece fuera del estándar MVC.

  • Los puntos de vista , que son responsables del estado de la interfaz de usuario, pero esto requeriría que las vistas se conozcan mutuamente para obtener información del estado, lo cual parece incorrecto.

  • El controlador , que debe enrutar la aplicación entre estados, tiene sentido, pero implica un viaje de ida y vuelta algo extraño, por ejemplo, el User selects "Show Images" --> View event listener is called --> View informs Controller --> Controller updates state --> Controller updates View (en lugar de que el User selects "Show Images" --> View event listener is called --> View updates más simple User selects "Show Images" --> View event listener is called --> View updates )

Supongo que de alguna manera esta es una pregunta genérica de MVC, pero estoy teniendo problemas para entenderlo. ¿Qué parte de la aplicación debería ser responsable de guardar el estado actual?

ACTUALIZACIÓN: Para referencia futura, utilicé un modelo de estado singleton global para este problema. El flujo de UI es el siguiente:

  1. Los controladores de la interfaz de usuario de la vista no hacen más que actualizar la app.State
  2. Mis enrutadores también no hacen más que actualizar la app.State . app.State : son esencialmente vistas especializadas que muestran y reaccionan a los cambios de URL.
  3. Las vistas escuchan los cambios en la aplicación. app.State y actualiza en consecuencia

Mi aplicación es de código abierto: puedes ver el código en Github . La pieza relevante aquí es el modelo de estado , que amplié para tratar con (de) el estado de serialización para la URL.


¿Por qué no crear un modelo de estado para almacenar y describir el estado actual? No creo que eso esté mal. Como el estado actual involucra a más de un modelo, creo que es razonable crear un modelo de estado para almacenar y recibir el estado actual.

El controlador podría comunicarse con el modelo de estado para obtener el estado actual. Sin embargo, los estados de IU deberían almacenarse en el modelo correspondiente. El modelo de estado sabe qué libro y qué página y luego el libro y los modelos de página llevan un registro de sus estados actuales de UI.


No limite sus aplicaciones Backbone a construcciones de Backbone . Si encuentra que su aplicación necesita alguna funcionalidad que no se adapte bien a uno de los constructos de Backbone, no la meta en una sola por el simple hecho de mantener todo en Backbone.

He encontrado esta repetición de la espina dorsal útil en este sentido. Configura módulos para usted y le proporciona un objeto de aplicación que amplía Backbone.Events (como en el artículo previamente vinculado). Este objeto de la aplicación se puede utilizar para almacenar modelos, vistas y controladores / enrutadores instalados, y debe tener la libertad de agregar sus propios módulos no troncales al objeto de la aplicación, para encargarse de las responsabilidades que no encajan perfectamente en uno de los Construcciones de columna vertebral.