2012-06-08 15 views
8

Estoy usando el administrador de región de Marionette para administrar mis vistas. Hay tres regiones principales: 1] región Menú superior 2] región de la barra lateral 3] región principal (la página real que va cambiando)Ocultando una vista en el Administrador de regiones, cuando se muestra otra vista

Dependiendo de las acciones en el menú superior y la barra lateral guardo el cambio de la opinión de que se representa en las regiones principales usando App.MainRegion.show(view).

Ahora hay una vista particular (persistView) que una vez renderizada no se debe cerrar a menos que la pestaña/navegador esté cerrado.

Naturalmente no puedo usar el App.MainRegion.show(view) aquí por razones Foll:

  1. Cuando el show(persistView) se llama la primera vez que todo está bien.
  2. Si navego lejos, el show(otherview) llamará al close() de persistView. Que no es obligatorio

Mi solución actual es:

  1. tener una nueva región llamada persistRegion justo debajo de la mainRegion.
  2. persistView siempre se representarán en el persistRegion.
  3. En el onShow() de persistView, i ocultar la mainRegion y mostrar el peristRegion

Los trabajos anteriores, pero creo que es muy hacker. También estoy atascado cuando después del paso 3] el usuario navega a cualquier otra vista. Ahora, ¿cómo le digo al persistView que debería ocultarse y mostrar el mainRegion?

Cualquier ayuda será muy apreciada.

Respuesta

25

Creo que su diseño suena bien, en términos de tener una región para mantener la vista "persistente" frente a la vista principal. Pero no permitiría que esas dos regiones se conocieran entre sí ni trataran de controlar la pantalla de la otra. En cambio, crearía un objeto separado que sabe cómo hacer esto.

Este objeto sería responsable de escuchar los eventos correctos de las diversas vistas y regiones involucradas. Entonces determinaría qué regiones mostrar y ocultar.

Sin embargo, la clave está en cómo mostrar y ocultar las regiones. No desea cerrar las regiones y eliminar las vistas en ellas, al menos no en el persistRegion. Lo que puede hacer en su lugar, sin embargo, es hide() de la región el

persistRegion.$el.hide()

y

persistRegion.$el.show()

atributo $el de la región estará disponible después de un punto de vista ha sido exhibida dentro de la región, o después de llamar al region.ensureElement().

+6

solo una nota: region.ensureElement() se cambió a region.ensureEl() –

+1

... y ha cambiado nuevamente, a '_ensureElement()' – alxndr

1

Puedo sugerir usar el método reset() de las regiones de marionetas, en lugar de ocultar y mostrar el elemento de la región. Aquí hay un enlace al documento http://marionettejs.com/docs/v2.4.4/marionette.region.html#reset-a-region => Una región se puede restablecer en cualquier momento. Esto destruye cualquier vista existente que se muestra, y borra el el caché. La próxima vez que la región muestra una vista, el dominio de la región se consulta desde DOM.

myRegion.reset(); Esto es útil cuando las regiones se vuelven a utilizar en instancias de vista y en pruebas de unidad.

+1

Debe incluir la información relevante del enlace en su respuesta para que la información relevante no se pierda en caso de que el enlace muera. – drneel

Cuestiones relacionadas