2012-04-03 11 views
10

Sto eseguendo Backbone js 0.9.2 su Rails 3.2.2, ho una pagina per aggiungere righe di costo. Un costo ha 3 campi di testo: titolo, descrizione e prezzo.Coda Ajax Backbone js

Sto risparmiando ogni costo su sfocatura.

model.save() viene chiamato più volte con intervalli molto brevi. Quale problemi uno create(post) richiede quindi una richiesta update(put) poco dopo. Il problema che sto vivendo è che la richiesta PUT raggiunge talvolta il server prima del POST, con il risultato che quel modello viene creato e mantenuto due volte (duplicato).

Per salvare su sfocatura è il comportamento richiesto, quindi ho bisogno di un modo per accodare le richieste. Ho letto qualcosa su Spine js e che lo risolvono con una specie di coda. Ho anche cercato su this, ma non riesco a capirlo.

Sembra che questo dovrebbe essere un problema comune, che funziona con "app a pagina singola" ma non riesce a trovare nulla a riguardo.

risposta

9

È possibile sovrascrivere il metodo di salvataggio e creare una coda con deferred object. Ad esempio,

var MDef = Backbone.Model.extend({ 
    url: "/echo/json/?delay=3", 

    initialize: function() { 
     this.queue = $.Deferred(); 
     this.queue.resolve(); 
    }, 

    save: function(attrs,options) { 
     var m = this; 
     console.log("set "+JSON.stringify(attrs)); 

     // this.queue = this.queue.pipe with jquery<1.8 
     this.queue = this.queue.then(function() { 
      console.log("request "+JSON.stringify(attrs)); 
      return Backbone.Model.prototype.save.call(m, attrs, options); 
     });    
    } 
}); 

var m = new MDef(); 
m.save({title: "a title"}); 
m.save({description: "a description"}); 
m.save({price: "a price"}); 

E un violino: http://jsfiddle.net/nikoshr/8nEUm/

+0

Usando questo con grandi risultati, grazie! –

3

Utente debounce da underscore.js.

Crea e restituisce una nuova versione di debounced della funzione passata che posticiperà l'esecuzione fino a dopo che sono trascorsi millisecondi dall'ultima volta in cui è stato richiamato.

In questo modo verrà attivato solo una volta dopo l'ultimo evento blur.

+2

Questa non è una prova di proiettile soluzione, può risolvere la maggior parte dei casi, ma c'è ancora la possibilità che i dati possono essere persi. –

+0

@TimBrunsmo, @abraham 'debounce' ha ragione. Come verranno persi i dati? È possibile * sostituirlo con '_.throttle' se si desidera forzare salvataggi periodici. – ggozad

+1

@ggozad Se un campo è focalizzato e l'utente sceglie di lasciare la pagina, ad esempio facendo clic sul pulsante "Avanti", c'è la possibilità che l'evento sfocatura non emetta mai una richiesta. Se c'è una coda, è possibile controllare se la coda è finita e quindi lasciar passare l'utente. –