2011-09-05 2 views
5

Ho uno scenario classico di dettaglio principale che sto implementando in backbone.js.Backbone.js Scenario master-detail

Per il momento non sono interessato alla cronologia e alla parte di navigazione di backbone.js quindi lo sto saltando.

  • Ho un GridView in cui tutti i modelli vengono recuperati e visualizzati da un servizio di assistenza.
  • Ho una vista dettagliata (finestra modale) in cui viene visualizzato un particolare modello selezionato da una griglia con più campi visualizzati nella vista della griglia principale.

ho implementato:

  • un'applicazione principale dove sono attaccati tutti i punti di vista di backbone e router.
  • l'applicazione viene inizializzata sul documento caricato
  • un router backbone principale (che agisce più come un "controllore" classica) con responsabilità di:
    • la creazione e la vista distruggendo
    • fetching e pubblicazione di dati
    • passaggio dati alle viste
    • Visto coordinamento eventi

Ora i dati restituiti dal servizio resto per gridView (raccolta Backbone) sono solo alcuni dati parziali dei modelli.

Quindi, per visualizzare tutti i dettagli di un particolare modello devo andare a prendere la carta di nuovo dal servizio resto.

Il recupero dal modello termina con un modello disconnesso dalla raccolta e qualsiasi aggiornamento su di esso non si riflette sulla raccolta stessa e devo aggiornare nuovamente la vista master recuperando tutti i dati.

Distruggere e ricreare la vista dettagli a volte può far perdere gli eventi di visualizzazione.

Quale sarebbe la corretta implementazione di questo scenario? Non riesco a comprendere appieno il modo migliore di fare cose in backbone.

risposta

7

In primo luogo, vorrei suggerire restituire il dettaglio completo per i modelli nella query collezione "GridView". Questo risolve il problema della "raccolta disconnessa".

Anche se non è necessario eseguire il pieno carico di raccolta - diciamo che fare un carico completo per l'intera raccolta non funzionerà - i dettagli sono troppo grandi, ad esempio, dovresti essere in grado di passare stesso modello dalla raccolta nella tua vista di dettaglio, prova per vedere se è un carico parziale o completo e emette un "fetch()" per il modello, restituendo i dati completi - poiché si tratta dello stesso modello del collezione, dovrebbe essere aggiornato. Ha senso?

Inoltre, per le viste di dettaglio, suggerirei, soprattutto se si progettano solo chiamate per una vista dettagliata attiva, per riutilizzare la vista e scrivere una funzione nella vista che consente di sostituire il modello.

Così, in sintesi:

  • All'avvio dell'applicazione, caricare un GridView e uno detailview.
  • refactoring detailView per consentire l'impostazione di modelli su di esso. (detailView.setModel (..)
  • quando l'utente desidera visualizzare i dettagli su un modello, passare tale modello in detailView utilizzando la funzione sopra riportata
  • se il modello non è completamente caricato, il metodo setModel può vai e recupera() il resto dei dati Puoi testare una proprietà specifica che sarebbe presente solo a pieno carico o impostare una proprietà sul modello per indicare se è stata caricata completamente
  • Se ti trovi perdendo gli eventi, prova a chiamare delegateEvents() alla fine della funzione render() rebind gli eventi
  • Poiché lo stesso modello viene utilizzato sia nella raccolta gridView che nel detailView, supponendo che tu stia rispondendo agli eventi di modifica correttamente, vigilia tutto dovrebbe essere sincronizzato.