2012-06-07 6 views
5

a muy poca pregunta sobre el uso de Backbone.js con LocalStorage:Backbone.js y almacenamiento local con múltiples pestañas del navegador/ventanas sobrescribe los datos

Estoy almacenando una lista de cosas (colección Backbone) en LocalStorage. Cuando mi sitio web está abierto en varias ventanas/pestañas del navegador y el usuario en ambas ventanas agrega algo a la lista, los cambios de una ventana sobrescribirán los cambios realizados en la otra ventana.

Si quieres probar por sí mismo, sólo tiene que utilizar el ejemplo Backbone.js Todo aplicación:

  1. abierto http://backbonejs.org/examples/todos/index.html en dos pestañas del navegador
  2. Añadir un elemento 'ELEMENTO1' en la primera pestaña y 'elemento2 'en la segunda pestaña
  3. Refresh dos pestañas: 'elemento1' desaparecerá y se le dejó con 'elemento2' sólo

alguna sugerencia de cómo evitar que esto suceda, cualquier forma estándar para de al con esto?

THXX

Respuesta

4

Se ha producido un problema conocido de pérdida de concurrencia, consulte Lost update in Concurrency control?. Sólo para su comprensión que podría proponer la siguiente solución rápida y sucia, presentar backbone-localstorage.js, Store.prototype.save:

save: function() { 
    // reread data right before writing 
    var store = localStorage.getItem(this.name); 
    var data = (store && JSON.parse(store)) || {}; 
    // we may choose what is overwritten with what here 
    _.extend(this.data, data); 

    localStorage.setItem(this.name, JSON.stringify(this.data)); 
} 

Para el latest Github version of Backbone localStorage, creo que esto debería tener este aspecto:

save: function() { 
    var store = this.localStorage().getItem(this.name); 
    var records = (store && store.split(",")) || []; 
    var all = _.union(records, this.records); 
    this.localStorage().setItem(this.name, all.join(",")); 
} 
+0

¡Gracias! Solo la pista que necesitaba. Sé que es un truco, pero funciona. – user1151506

+2

Edité su respuesta para incluir código que funciona con la última versión de Github de Backbone localStorage. – user1151506

+0

Oye, ¿cómo haces para limpiarlo? – Lion789

2

Es posible que desee utilizar sessionStorage lugar. Ver http://en.wikipedia.org/wiki/Web_storage#Local_and_session_storage.

+0

Esta es la respuesta correcta. Solo hay un adaptador de almacenamiento local para backbone.js, http://backbonejs.org/docs/backbone-localstorage.html. Tendrás que escribir tu propia implementación para usar el almacenamiento de sesión. –

+0

Lo siento, debería haber sido más claro. Lo que quiero es ** localStorage **, ya que necesito que los datos se mantengan entre sesiones. Simplemente tome la lista anterior de Todo como un ejemplo: no quiere que su lista de tareas pendientes se borre cuando cierre la pestaña o la ventana del navegador. La próxima vez que vuelva a su aplicación, querrá que esté allí. – user1151506

+0

Imagine que abrió dos ventanas, ingresó datos diferentes, cerró ambas, abrió una nueva. ¿Cuál de los dos previamente cerrados debería tomar datos? Entonces necesita una autorización y una autenticación plenas. – Yaroslav

2

comentario de Yaroslav acerca de la comprobación para los cambios antes de persistir los nuevos es una solución, pero mi sugerencia sería diferente. Recuerde que localStorage es capaz de activar eventos cuando realiza acciones que cambian los datos que contiene. Vincúlate con esos eventos y haz que cada pestaña escuche esos cambios y visualice la repetición después de que ocurra.

Luego, cuando hago eliminaciones o adiciones en una pestaña y paso a la siguiente, obtendrá un evento y un cambio para reflejar lo que sucedió en la otra pestaña. No habrá discrepancias extrañas en lo que estoy viendo pestaña a pestaña.

Desea pensar en asegurarse de que no pierdo algo que estaba en el medio de agregar (digamos, empiezo a escribir una nueva entrada para mi lista de tareas pendientes), cambiar a otra pestaña y eliminar algo, y luego regrese. Quiero ver que la entrada desaparezca pero mi nuevo ítem parcialmente tipado aún debería estar disponible para mí.

+0

Esta solución tiene una mejor experiencia de usuario. – Yaroslav

+0

Esta solución parece formalmente más correcta y sería menos pirata, ¡cierto! Pero viene con muchas peculiaridades o falta de soporte en IE, Safari y Chrome. Acabo de probarlo y funciona bien en FF, pero no realmente en Chrome, por lo que fui con el truco mencionado anteriormente. – user1151506

Cuestiones relacionadas