Вы не можете сделать это:
var ProductView = Backbone.View.extend({
el: $('#product-list'),
// ...
и получите что-нибудь полезное в el
, так как #product-list
, вероятно, даже не присутствует в DOM, когда создается ProductView; поэтому попытка использовать $('#product-list')
для el
- это просто классическая проблема "Я забыл использовать $(document).ready()
", одетый в Backbone. Использование $('#product-list')
для el
должно работать, если #product-list
присутствует, когда вы определяете ваш ProductView, хотя.
Вы можете сделать это, хотя:
var ProductView = Backbone.View.extend({
el: '#product-list',
// ...
, а затем скажите $(this.el)
, когда вам нужно что-то делать внутри методов представления. $(this.el)
не только является обычным способом использования el
, но также работает, и это очень важно.
Те же проблемы относятся к #product_template
.
Глядя на ваш код, я вижу это:
// INstantiate the view
this.view = new ProductView();
// Bind the view and collection
// So when the collection is reset, the view executes the render method
Products.bind("reset", this.view.render);
Предположительно, render
запускается событием сброса. Но, и это большое, но метод render
не привязан вправо this
где-либо, поэтому this
не будет ProductView
при вызове render
и this
не будет есть все, что вы ожидали; следовательно, ваша причудливая «неопределенная» ошибка.
Вы можете использовать _.bindAll
в своем initialize
:
initialize: function() {
_.bindAll(this, 'render');
// ...
но, как правило, вы хотите предоставить представлению коллекцию при ее создании, и представление связывается с событиями, поэтому ваша структура все равно будет немного странной.
Вы также можете указать контекст (AKA this
), когда звоните bind
:
collection.bind('reset', this.render, this);