Pregunta Backbone.js: comunicación entre vistas


Estoy trabajando en una aplicación Backbone que contiene una lista de entradas, al igual que la aplicación de ejemplo Todos (http://documentcloud.github.com/backbone/examples/todos/index.html)

Entonces, tengo una vista de aplicación y una vista por artículo 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 la lista cambien su apariencia.

¿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 la vista de la aplicación (de fábrica) no conoce las vistas de lista.

enter image description here


32
2017-09-20 13:09


origen


Respuestas:


Escribí un artículo hace un tiempo sobre algunas opciones diferentes para coordinar las vistas: 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.


41
2017-09-20 13:41



Mis dos centavos: hay un "truco" simple que puedes hacer con backbone.js para tener realmente un pub / sub que pueda comunicarse entre las vistas:

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 entiendes 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. Solo crea un espacio vacío EventBus 'clase' en ese caso y todas las vistas se unen a él :)

Entonces, cada vista solo necesita estar acoplada a esto EventBus y actuar en eventos recibidos! Backbone.js maneja internamente todas las tuberías de este patrón de diseño, por lo que prácticamente se obtiene gratis :)

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


2
2017-09-23 20:18