2011-09-20 17 views
32

Estoy trabajando en una aplicación Backbone que contiene una lista de entradas, muy similar a la aplicación de ejemplo Todos (http://documentcloud.github.com/backbone/examples/todos/index.html).Backbone.js: comunicación entre vistas

Entonces, tengo una vista de aplicación y una vista por cada elemento de la lista. Ahora, di que tengo un botón de edición global. La vista de la aplicación manejaría un clic y lo que quiero hacer es decirle a cada vista de lista que muestre un botón de eliminar.

En las capturas de pantalla a continuación (de Spotify), presionar el botón Editar hace que todas las vistas de lista cambien de aspecto.

¿Cuál es la mejor manera de hacer esto con Backbone. Necesito iterar sobre todas las vistas de lista y llamar a una función editMode. Pero el punto de vista de la aplicación (de la caja) no sabe nada de las vistas de lista ..

enter image description here

+3

Vine aquí para hacer esta misma pregunta y vi la tuya en mi página principal ... espeluznante. –

Respuesta

41

escribí un artículo hace un tiempo en un par de opciones diferentes para la coordinación entre los puntos de vista: http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/

en su caso, recomendaría usar el agregador de eventos que describo en ese artículo. puede hacer que cada vista de elemento escuche un evento "editmode" o algo similar. cuando se activa este evento, cada vista que lo escuchó se actualizará para pasar al modo de edición. entonces haría lo opuesto cuando hace clic en "hecho" - envíe un evento "viewmode", o algo similar, y haga que cada vista se actualice adecuadamente.

+1

Supongamos que, por ejemplo en la pregunta, la vista de cada pista tiene una referencia a la colección de pistas. Ya sea directamente o a través de una propiedad del modelo de pista que respalda cada vista de pista. ¿Sería incorrecto enviar eventos 'editmode' a través de esta colección? De esta forma, no necesita un objeto de evento separado para facilitar esto. –

+1

"incorrecto" es muy subjetivo. depende de la complejidad involucrada en su aplicación, y qué tan lejos debe llegar el camino de desacoplamiento de su aplicación. Puede comenzar pasando por la colección y ver si eso funciona para usted. si comienza a ver todo muy bien acoplado, entonces restructure para usar un objeto de evento separado. –

+0

@DerickBailey: me gusta mucho el patrón que describes en tu artículo. Gracias por compartir. – UpTheCreek

2

Mis dos centavos: No es un simple "Hack" que puede hacer con Backbone.js que en realidad tienen un pub/sub que se puede comunicar entre puntos de vista:

Algo a lo largo de estas líneas (no probado):

var EventBus = Backbone.Model.extend({ 

    publish: function(event, args){ 

     this.trigger(event, args); 

    }, 

    subscribe: function(event, args) { 

     this.bind(event, args); 

    } 
}); 

Básicamente tienes la idea. Ahora, para cada vista, haz que se "vincule" a este EventBus (ya que las vistas solo se pueden unir a modelos/colecciones en la red troncal); básicamente utilizas los nombres de método publicar/suscribir para sincronizar con la nomenclatura de dicho modelo pero tú puede elegir no hacerlo. Simplemente cree una EventBus 'clase' vacía en ese caso y haga que todas las vistas se vinculen a ella :)

¡De modo que cada vista solo debe acoplarse a este EventBus y actuar sobre los eventos recibidos! Backbone.js maneja internamente todas las cañerías de este patrón de diseño, así que prácticamente lo obtiene gratis :)

El código anterior puede no ejecutarse tal como está, pero está ahí para darle una idea al respecto ...

+1

There's Backbone.Event ya, así que ¿por qué no mantener las cosas SECAS? – opengrid

+0

@opengrid - esto fue para v0.5.1. cuando "cómo usar los Eventos" no se publicitó tan bien :) – PhD

+1

Diciendo: "Básicamente tienes la idea" en lugar de explicar claramente lo que quieres decir que no es muy útil, y puede ser más frustrante que útil para las personas que están tratando de encontrar una respuesta – Pea

Cuestiones relacionadas