2011-11-26 12 views
5

Mi permetto di definirmi un hacker backbone. So cosa può fare il framework e dove sono i suoi limiti. Ho anche qualche esperienza con alcuni framework di modelli.Perché tutti stanno ancora costruendo viste padre-figlio usando il metodo render?

Ho visto molti tutorial in cui le persone spiegano come creare viste complesse e nidificate, e la maggior parte di loro lo costruisce in qualche modo usando i modelli, e quindi all'interno del metodo di rendering della vista genitore, per combinare il modello visualizzazioni

Per me, questo non ha senso perché si dovrebbe trattare il rendering del layout, nel codice dichiarativo. Venendo da Flex, mi è stato insegnato a non farlo mai. Ho sempre lasciato le descrizioni del layout e le associazioni delle variabili al markup e quindi la gestione degli eventi al codice dichiarativo (View instance) che utilizza questo markup.

Nessuno dei framework di template che ho testato, tuttavia, consente la creazione di markup complessi, con viste nidificate. Non si può davvero invocare un modello da un modello e quindi creare un'istanza di un oggetto View. Ciò sembra tecnicamente possibile, specialmente usando gli attributi dei dati, dove potremmo specificare i nomi dei tipi.

Quindi, tutto il metodo di rendering della classe View livello radice deve fare è trasformare questo modello in markup HTML, quindi scoprire quali dovrebbero essere i tipi degli oggetti figli, creare un'istanza di vista figlio per ognuno di essi, e mantieni la distanza, nel caso in cui quegli oggetti figlio dovrebbero avere oggetti figlio stessi. Ad ogni vista viene dato un contesto modello. Fondamentalmente tutti i passaggi standard che trattiamo sempre, ma automatizzati a livello Backbone.View.

Qualcun altro sta pensando a questo? Perché nessuno sembra utilizzarlo?

+0

[la trinità fa banalmente il markup complesso con viste nidificate] (https://github.com/Raynos/trinity).È inoltre possibile preelaborare facilmente le viste della trinità per creare oggetti Vista dorsale per tutte le viste nidificate. Il problema con il tuo concetto è che hai bisogno di un sistema di templating decente che permetta un'eredità potente, quelle rare. – Raynos

+5

Ho la sensazione che questo appartenga altrove, non è un problema definito con il tuo codice che può essere risolto, è più una discussione sulle migliori pratiche con viste genitore-figlio ... tendo quindi a vedere questo più come una discussione che come una Q & A argomento. forse qualcosa per la community Wiki? – Sander

+0

Anche se non conosco il tuo particolare problema, si dovrebbe notare che la libreria AWT di Java si comporta nel modo in cui la descrivi come negativa. I gestori di layout posizionano l'elenco di elementi di controllo. I bambini vengono renderizzati in modo ricorsivo per costruire un albero di controllo/contenitore. Avendo costruito visualizzazioni di rendering ricorsive in Backbone con Handlebars.js, preferisco di gran lunga una soluzione basata su codice più elegante piuttosto che tentare di hackerare i miei modelli che sembrano richiedere sempre operazioni di template personalizzate. – Max

risposta

1

Si noti che non è necessario utilizzare il rendering ed è principalmente riservato per il re-rendering dopo aver apportato le modifiche al codice. È possibile associare le viste direttamente in base ai selettori CSS (consultare i documenti per questo).

Inoltre, esiste un'estensione di associazione modello per Backbone che semplifica enormemente l'associazione dati e riduce il lavoro "manuale" richiesto. Potresti voler controllare.

http://github.com/derickbailey/backbone.modelbinding

Infine voglio dire questo di rendering di relazioni padre-figlio. Do not call the DOM in a loop. Questo è incredibilmente inefficiente e almeno una ragione per cui le persone costruiscono relazioni genitore-figlio solo nel metodo di rendering dei genitori. Avere il rendering di ogni figlio usando say jQuery risulterà in un sacco di lavoro per il browser (se non lo si nota in un browser moderno, provalo in IE8).

1

Sono d'accordo che l'istanziazione di viste secondarie nel metodo render non ha senso. Anche se mi piacerebbe essere riluttanti a automatizzare completamente il processo, perché spesso mi voglio passare in argomenti aggiuntivi quando si inizializza una vista del bambino, ad esempio:

var childCollection = someLogicToCreateTheChildCollection(); 

new ChildView({ 
    collection : childCollection 
}); 

Quindi, quello che finisce per fare invece è la creazione di eventuali pareri del bambino di cui ho bisogno in initialize e quindi in render Rendo il modello e assegna le viste secondarie agli elementi nel DOM.

In questo modo la mia funzione di rendering non è quella che dichiara l'ordine DOM (come mostrano molti esempi accodando) - il modello imposta l'ordine DOM e la funzione di rendering solo le viste secondarie di setElement().render().