2012-06-07 4 views
5

solo una breve domanda sull'uso Backbone.js con LocalStorage:backbone.js e storage locale con più schede del browser/windows sovrascrive i dati

che sto memorizzare un elenco di cose (raccolta Backbone) in LocalStorage. Quando il mio sito web è aperto in più finestre/schede del browser e l'utente in entrambe le finestre aggiunge qualcosa all'elenco, le modifiche di una finestra sovrascriveranno le modifiche apportate nell'altra finestra.

Se volete provare da soli, basta usare l'esempio Backbone.js Todo app:

  1. aperto http://backbonejs.org/examples/todos/index.html in due schede del browser
  2. Aggiungere un elemento 'Elemento1' nella prima scheda e 'item2 'nella seconda scheda
  3. Refresh entrambe le schede: 'item1' scomparirà e ti verrà lasciato con 'item2' solo

eventuali suggerimenti su come evitare che ciò accada, qualsiasi modo standard per de con questo?

thxx

risposta

4

Il problema è noto problema di aggiornamenti persi da concorrenza, vedere Lost update in Concurrency control?. Solo per la vostra comprensione che potrebbe proporre la seguente correzione rapida e sporca, archiviare 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)); 
} 

Per la latest Github version of Backbone localStorage, credo che questo dovrebbe essere simile a questo:

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

Grazie! Solo il suggerimento di cui avevo bisogno. So che è una specie di trucco, ma fa il trucco. – user1151506

+2

Ho modificato la risposta per includere il codice che funziona con la versione Github di Backbon localStorage più recente. – user1151506

+0

Ehi, come vai a ripulirlo? – Lion789

2

Si consiglia di utilizzare sessionStorage invece. Vedi http://en.wikipedia.org/wiki/Web_storage#Local_and_session_storage.

+0

Questa è la risposta corretta. C'è solo un adattatore di archiviazione locale per backbone.js, http://backbonejs.org/docs/backbone-localstorage.html dovrai scrivere la tua implementazione per usare la memoria di sessione –

+0

Scusa, avrei dovuto essere più chiaro. Quello che voglio è ** localStorage **, in quanto ho bisogno che i dati siano mantenuti tra le sessioni. Basta prendere come esempio la lista di cose da fare sopra: Non vuoi che la tua lista di cose da fare venga cancellata quando chiudi la scheda o la finestra del browser. La prossima volta che torni alla tua app, vuoi che sia lì. – user1151506

+0

Immagina di aver aperto due finestre, di aver riempito dati diversi, di averli chiusi entrambi, di averne aperto uno nuovo. Quale dei due precedentemente chiusi dovrebbe prendere dati da? Allora hai bisogno di un'autorizzazione e un'autenticazione a tutti gli effetti. – Yaroslav

2

commento di Yaroslav sulla verifica per le modifiche prima di persistere di nuove è una soluzione, ma il mio suggerimento sarebbe diverso. Ricordare che localStorage è in grado di attivare eventi quando esegue azioni che modificano i dati che contiene. Associare a tali eventi e fare in modo che ogni scheda rilevi tali modifiche e visualizzi nuovamente il rendering dopo che è stato eseguito.

Quindi, quando si effettuano cancellazioni o aggiunte in una scheda e si passa a quella successiva, si otterrà un evento e si cambierà per riflettere ciò che è accaduto nell'altra scheda. Non ci saranno strane discrepanze in ciò che vedo tab in tab.

Vorrete pensare a fare in modo che non perda qualcosa che ero nel mezzo di aggiungere (dire che inizio a digitare una nuova voce per la mia lista di cose da fare), passare ad un'altra scheda ed eliminare qualcosa, e poi tornare indietro Voglio vedere la voce scomparire ma il mio nuovo elemento parzialmente digitato dovrebbe essere ancora disponibile per me.

+0

Questa soluzione ha una migliore esperienza utente. – Yaroslav

+0

Questa soluzione sembra formalmente più corretta e sarebbe meno incisiva, vero! Ma viene fornito con un sacco di stranezze o mancanza di supporto in IE, Safari e Chrome. Ho appena provato e funziona bene in FF ma non proprio in Chrome, ed è per questo che sono andato con l'hack menzionato sopra. – user1151506