Проблема в том, что при определении ContinentsView шаблон оценивается и использует $('#continents-template')
- но DOM еще не готов, поэтому он не находит шаблон.
Чтобы решить эту проблему, просто переместите присвоение шаблона в функцию инициализации:
ContinentsView = Backbone.View.extend({
el: '#continents',
initialize: function() {
this.template = _.template($('#continents-template').html());
}
...
Что касается коллекций, то да, они группируют объекты, в частности наборы моделей.
Вы должны создать код, чтобы модели (и коллекции) НЕ знали о представлениях, только представления знают о моделях.
ContinentModel = Backbone.Model.extend({});
ContinentsCollection = Backbone.Collection.extend({
model: ContinentModel,
// no reference to any view here
});
ContinentsView = Backbone.View.extend({
el: '#continents',
initialize: function() {
this.template = _.template($('#continents-template').html());
// in the view, listen for events on the model / collection
this.collection.bind("reset", this.render, this);
},
render: function() {
var renderedContent = this.template(this.collection.toJSON());
$(this.el).html(renderedContent);
return this;
}
});
$(function() {
var continentsCollection = new ContinentsCollection();
continentsCollection.reset([{name: "Asia"}, {name: "Africa"}]);
// initialize the view and pass the collection
var continentsView = new ContinentsView({collection: continentsCollection});
});