2011-09-20 6 views
32

Sto lavorando a un'app Backbone che contiene un elenco di voci, proprio come l'app di esempio Todos (http://documentcloud.github.com/backbone/examples/todos/index.html).Backbone.js: comunicazione tra le viste

Quindi, ho una vista App e una vista per voce di elenco. Ora, dì che ho un pulsante di modifica globale. La vista App gestiva un clic e quello che voglio fare è dire a ogni vista elenco di mostrare un pulsante di cancellazione.

Nelle schermate seguenti (da Spotify), premendo il pulsante Modifica, tutte le viste elenco cambiano aspetto.

Qual è il modo migliore per farlo con Backbone. Ho bisogno di scorrere tutte le visualizzazioni elenco e chiamare una funzione editMode. Ma la vista App (out of the box) non conosce il punto di vista della lista ..

enter image description here

+3

Sono venuto qui per fare esattamente questa stessa domanda e mi è capitato di vedere il tuo in prima pagina ... inquietante. –

risposta

41

ho scritto un articolo un po 'indietro su alcune opzioni diverse per il coordinamento tra le viste: http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/

nel tuo caso, mi consiglia di utilizzare l'aggregatore di eventi che descrivo in quell'articolo. si potrebbe avere la visualizzazione di ogni elemento per un evento "editmode" o qualcosa di simile. quando questo evento viene attivato, ciascuna vista che l'ha ascoltata si aggiornava per passare alla modalità di modifica. poi faresti il ​​contrario quando fai clic su "done" - invia un evento "viewmode" o qualcosa di simile, e ogni vista si aggiorna in modo appropriato.

+1

Supponiamo che, per l'esempio nella domanda, la vista di ogni traccia abbia un riferimento alla collezione di tracce. O direttamente o attraverso una proprietà del modello di traccia che supporta ciascuna vista di traccia. Sarebbe sbagliato inviare eventi "editmode" attraverso questa collezione? In questo modo non è necessario un oggetto evento separato per facilitare questo. –

+1

"sbagliato" è molto soggettivo. dipende dalla complessità della tua app e da quanto in giù lungo il percorso di disaccoppiamento della tua app. potresti iniziare passandolo attraverso la raccolta e vedere se questo funziona per te. se si inizia a vedere tutto troppo strettamente accoppiato, quindi ristrutturare per utilizzare un oggetto evento separato. –

+0

@DerickBailey - Mi piace molto lo schema che descrivi nel tuo articolo. Grazie per la condivisione. – UpTheCreek

2

I miei due centesimi: v'è un semplice "hack" si può fare con backbone.js di avere in realtà un pub/sub in grado di comunicare tra le visualizzazioni:

Qualcosa in questo senso (non testata):

var EventBus = Backbone.Model.extend({ 

    publish: function(event, args){ 

     this.trigger(event, args); 

    }, 

    subscribe: function(event, args) { 

     this.bind(event, args); 

    } 
}); 

Fondamentalmente si ottiene l'idea. Ora per ogni vista, devi legarla a questo EventBus (dato che le viste possono collegarsi solo a modelli/raccolte in backbone) - in pratica usi semplicemente i nomi dei metodi publish/subscribe per essere sincronizzati con la nomenclatura di un tale modello, ma tu può scegliere di non farlo Basta creare una "classe" EventBus vuota e ogni vista associare ad essa :)

Quindi ogni vista deve solo essere accoppiata a questo EventBus e agire sugli eventi ricevuti! Backbone.js gestisce internamente tutti gli impianti idraulici di questo modello di progettazione, quindi puoi ottenerlo gratuitamente :)

Il codice sopra potrebbe non funzionare così com'è, ma è lì per darti un'idea a riguardo ...

+1

C'è già Backbone.Events, quindi perché non mantenere le cose ASCIUTTE? – opengrid

+0

@opengrid: questo era per v0.5.1. quando "come usare gli eventi" non era altrettanto pubblicizzato :) – PhD

+1

Dicendo: "Prendi sostanzialmente l'idea" invece di spiegare chiaramente cosa intendi non è molto utile, e può essere più frustrante che utile per le persone che sono cercando di trovare una risposta – Pea