2011-04-14 9 views
9

Ho giocato con KnockoutJS e mi piace moltissimo quanto semplifica il design da ogni angolazione, evitando che le cose cadano attraverso le fessure. La mia domanda è qual è la "best practice" raccomandata per il salvataggio dei dati sul server? La mia comprensione è che in un MVVM connesso, la prima "M" è il livello dati e quindi il rilevamento delle dipendenze e le notifiche nel trigger ViewModel vengono salvati direttamente sul livello dati. In un'app JavaScript, siamo disconnessi e rispediamo selettivamente al server usando AJAX.Il modo migliore per salvare le modifiche nell'applicazione Web MVVM/Knockoutjs?

L'app in cui mi sto attualmente utilizzando è MVC3 e ottengo assolutamente come scrivere un'azione "Salva" sul mio controller, plopare un pulsante "Salva" da qualche parte sulla mia pagina, postare l'intero ViewModel in quella azione Salva e quindi persistono nel database. Ma cosa succede quando fai una modifica veloce e poi la salvi di nuovo? O cosa succede se un pulsante Salva non si adatta al flusso del design? Invece, vuoi postare l'azione ogni volta che viene apportata una modifica sul modulo senza alcun pulsante Salva? Le idee che ho rimbalzato in giro sono:

  • Messaggio tutto il ViewModel ogni volta che qualsiasi cambiamento è fatto e fanno la figura di azione ciò che è nuovo e ciò che non lo è (non è l'ideale, soprattutto per i modelli di grandi dimensioni, se non altrimenti perché i dati trasmessi su ogni salvataggio sarebbero inutilmente grandi).
  • Aggiungere una proprietà a ciascun elemento nel ViewModel che tiene traccia se è nuovo e/o modificato dall'ultimo salvataggio. Quindi, grep out quegli articoli e posta solo quelli sul server (non ho testato questo, ma presumo che questo può essere fatto utilizzando la proprietà _destroy, come previsto per una app Rails).
  • Separato in tanti ViewModels più piccoli è plausibile in modo che qualsiasi dolore delle prime due opzioni sia ridotto al minimo (ciò dovrebbe probabilmente essere fatto indipendentemente).
  • Qualche altro modo migliore?

sono fiducioso ci sono alcune buone idee là fuori che non ho pensato. Essere in grado di legare in modo dichiarativo tutto E ancora salvare in modo efficiente sarebbe fantastico.

+0

Stai confondendo MVC (come in ASP.NET MVC) e MVVM. Entrambi hanno sostanzialmente lo stesso schema, ma MVVM ha delle modifiche specifiche per la progettazione rispetto alle applicazioni WPF. – Will

+0

In realtà KnockoutJS (http://knockoutjs.com) utilizza il pattern MVVM, che è anche il riferimento del poster. –

+0

Bella domanda!La stessa domanda senza Knockout sarebbe forse ancora più utile, dato che è solo uno dei tanti, molti framework JS là fuori. Continuerò la mia ricerca per la risposta a questa domanda. – noocyte

risposta

0

L'unica altra cosa che potrei pensare è subscribing. Quando ho iniziato a leggere il tuo post, stavo pensando a flags w/grep.

Edit: Meglio ancora, ko.utils.compareArrays sembra essere molto promettente.

Here's un esempio di lavoro ..

L'unica cosa che resta da fare è rilevare le modifiche ai valori della 'trattenuto' valori. Comunque sei sulla buona strada.

+0

Wow. +1 per l'elegante implementazione e ho intenzione di andare avanti e segnare questo come la risposta per ora. La domanda era di natura più teorica, quindi sono sicuro che ci siano ancora altri metodi, ma il modo in cui viene creato questo esempio è geniale. Anche se c'è ancora un pulsante Salva in quella implementazione, la parte interessante è che non è necessario. Finché qualcosa attiva ko.utils.compareArrays, puoi _rezionare_ in modo selettivo solo gli array che ti interessano. Questo è esattamente ciò di cui ero curioso. Molto bene. Grazie per il tuo contributo. – Jorin

+0

felice di poter aiutare. –

+3

Il collegamento di esempio è rotto ... per caso l'esempio è ancora disponibile? Ho un viewmodel che ha diversi livelli di relazioni e ho cercato diverse opzioni per il salvataggio di – littlechris

5

Sono appena tornato da MIX11 dove ho frequentato this session su Knockout.js. Potrebbe valere la pena di guardare Steve Sanderson sfornare una demo CRUD completa.

+3

Sì, in realtà ho visto quella dimostrazione magistrale la settimana scorsa, non appena è stata postata online. Una demo davvero eccezionale che mostra ciò che Knockout può fare sul lato client, ma quando ha pubblicato sul server, non ha fatto nulla se non di ritrasmetterlo al client per dimostrare che stava effettivamente andando al server. Sono più interessato a ciò che la migliore pratica è quando si salvano le modifiche incrementali al server ... mantenendo il carico utile piccolo e il controller efficiente. – Jorin

Problemi correlati