2011-07-13 31 views
11

Come si ripristinano le modifiche del modello quando si verificano errori lato server (ad esempio errori di convalida)?Convalida lato server Backbone.js e altri errori lato server

Dato che determinate convalida devono essere eseguite sul lato server, qual è il modo appropriato per farlo con backbone.js (backend di Rails)?

Quando si salva un modello di dorsale, vengono avviati convalida sul lato client che forniscono l'esperienza utente appropriata se la convalida non riesce (le viste di tale modello non vengono aggiornate). Tuttavia, se la convalida sul lato server non riesce, il modello e tutte le sue viste sono già stati aggiornati (con dati non validi) prima del PUT sul server.

Sembra che ci siano alcuni problemi con questo.

  1. Tutte le viste vengono aggiornate prima che il modello sia stato convalidato sul lato server. Se, ad esempio, si dispone di un elenco di modelli con una finestra di dialogo di modifica , il modello nell'elenco viene aggiornato con potenzialmente informazioni non validabili dopo aver richiamato Model.save ma prima che sia stato convalidato lato server e PUT'ed.
  2. Se il server restituisce un errore (ad esempio 422 errore), non si verifica alcun 'rollback' del modello. I dati non invalidabili sono semplicemente seduti lì come uno stronzo. Questo è davvero il cattivo.

Sto usando backbone.js sbagliato? Esiste un modo ben noto per gestire questo scenario (molto comune)? Capisco che posso fare un po 'di cache manuale dei vecchi valori, ecc., Ma è una specie di soluzione maleodorante.

Grazie!

+0

Questa risposta sembra essere la seguente: http://stackoverflow.com/a/10335668/1284283 (un anno dopo, e probabilmente una versione più recente di backbonejs). – brightgarden

risposta

5

Non so se sto facendo questo torto (di nuovo da BackboneJS), ma ho avuto lo stesso problema ed ecco come ho risolto:

  • faccio tutto il mio convalide lato server

  • Invece di eseguire un normale modello.salva, faccio una chiamata ajax standard al server e restituisco un messaggio di errore o un messaggio di successo contenente gli attributi del modello modificato. Se è un successo, posso quindi eseguire model.set con gli attributi restituiti per aggiornare il modello e la vista corrispondente.

  • Se si desidera eseguire prima la convalida sul lato client, suppongo che si possa eseguire un salvataggio con l'opzione {silent: true}, in modo che le viste non vengano aggiornate, quindi effettuare la chiamata ajax e vedere che cosa è necessario essere fatto in base alla risposta (ripristinare i valori originali per il modello in caso di errore o aggiornare le visualizzazioni in caso di successo)

Spero che questo aiuti.

ps: funziona, ma non sembra "pulito". Se c'è una soluzione migliore, mi piacerebbe anche leggerlo

+0

Non sapevo del parametro {silent: true}. Questo potrebbe aiutare a mantenere le viste aggiornate mentre si trovano in uno stato intermedio. Sono d'accordo, il resto non sembra "pulito": P Mi spiace, non posso fare un "voto su"; Non ho ancora abbastanza reputazione. – John

0

Quello che farei sul lato server assicurati di rilevare eventuali errori e prima di restituire la query di risposta per il record originale dal DB e restituirla come JSON insieme con la risposta all'errore. Quindi puoi semplicemente eseguire questa operazione:

model.save({}, { 
    error: function(model, response){ 
    model.set(response); 
    } 
}); 

Supponendo che le tue visualizzazioni stiano guardando gli eventi di modifica sul modello, verranno aggiornati di conseguenza.

+0

Questo va bene per una certa sottoclasse di errori (ho iniziato a scendere questo percorso), ma per alcuni errori restituire una rappresentazione dell'oggetto potrebbe non essere fattibile o appropriato (ad esempio errori a livello di trasporto o "accesso negato" o "non registrato in 'specie di cose). In questo caso, tuttavia, potrebbe finire per alcuni errori; sarà sicuramente di aiuto con la normale validazione lato server. – John