I have 2 different templates for my model’s views. Each time the models are fetched from the database, the first 3 models (#1, 2, 3) fetched from the backend will have the view created using the first template, the next 4 models (#4, 5, 6, 7) will use the second template, the next 3 models (#8, 9, 10) will use the first template and so on.
Problem: How will I introduce this alternating template using backbone.js?
JS Code
// Views
PhotoListView = Backbone.View.extend({
el: '#photo_list',
render: function() {
$(this.el).html('');
_.each(this.model.models, function(photo) {
$(this.el).append(new PhotoListItemView({ model: photo }).render().el);
}, this);
return this;
}
});
PhotoListItemView = Backbone.View.extend({
tagNAme: 'div',
className: 'photo_box',
template: _.template( $('#tpl_PhotoListView').html() ),
initialize: function() {
this.model.bind('destroy', this.close, this);
},
render: function() {
$(this.el).html( this.template( this.model.toJSON() ) );
return this;
},
close: function() {
this.unbind();
this.remove();
}
});
First of all, your
PhotoListViewis wrapping a collection so you should be usingthis.collectioninside the view andnew PhotoListView({ collection: c })to create it. Views treat thecollectionoption similarly to how they treatmodel:Using the right names will help prevent confusion. Also, views have some Underscore methods already mixed in so you can say
this.collection.each(...)instead of_.each(this.collection.models, ...)or_(this.collection.models).each(...). You can also usethis.$elinstead of$(this.el).And now on to your real problem. You can add two templates to your per-model view:
and an option to tell it which one to use:
Then you just need to specify the
groupoption from the collection view. Underscore’seachpasses the iteration index to the callback function as the second argument so you just need a bit of integer math to figure out whichtemplate_numberto use: