Widok tabeli szkieletowej zużywający widok wiersza - jak go ustrukturyzować?
Mam kolekcję modeli, które chcę renderować w widoku tabeli. Każdy model powinien być reprezentowany przez pojedynczy wiersz w tabeli, a ten wiersz powinien być generowany przy użyciu szablonu. Powinienem mieć możliwość dołączania programów obsługi zdarzeń do tego wiersza (powiedzmy kliknięcie), które po zdarzeniu ostrzegają o określonych informacjach dotyczących modelu powiązanego z tym wierszem.
Powszechnym sposobem, w jaki widziałem podobne rzeczy, jest przerwanie każdego wiersza w jego własnym widoku i uzyskanie widoku nadrzędnego (powiedzmy, że tabela w tym przypadku) używa widoku wiersza, aby wygenerować kod HTML do uwzględnienia w kodzie . Jednak nie wiem, jak to działa z szablonami.
W tym przypadku nie mogę dołączyć zdarzeń specjalnie do RowView, ponieważ nie ma odniesienia do elementu dom (this.el
dla szkieletu), po prostu zwraca łańcuch. Jak mogę osiągnąć to, czego chcę, korzystając z szablonu do maksymalnej pojemności?
Pytanie nie dotyczy konkretnie zdarzeń, tworzenia szablonów lub używania zagnieżdżonych widoków, ale raczej właściwego sposobu użycia Backbone do osiągnięcia tego rodzaju wyników.
Przykładowy kod (także w askrzypce):
<code>/** View representing a table */ var TableView = Backbone.View.extend({ tagName: 'table', render: function() { var rows = _.map(this.collection.models, function(p) { return new RowView({model: p}).render(); }); $('body').html(this.$el.html(rows.join(''))); } }); /** View representing a row of that table */ var RowView = Backbone.View.extend({ render: function() { // imagine this is going through a template, but for now // lets just return straight html. return '<tr>' + '<td>' + this.model.get('name') + '</td>' + '<td>' + this.model.get('age') + '</td>' + '</tr>'; } }); var data = [ {'name': 'Oli', 'age': 25}, {'name': 'Sarah', 'age': 20}]; /** Collection of models to draw */ var peopleCollection = new Backbone.Collection(data); var tableView = new TableView({collection: peopleCollection}); tableView.render(); </code>
Dziękuję Ci!