У меня возникла проблема с успешным рендерингом представления backbone.js из обработчика маршрута (приложения браузера).
Мой модуль javascript в настоящее время настроен следующим образом:
$(function () { // DOM ready
myModule.Init();
});
var myModule = (function () {
// Models
var DonorCorpModel = Backbone.Model.extend({ });
// Collections
var DonorCorpsCollection = Backbone.Collection.extend({ model : DonorCorpModel });
// Views
var DonorCorpsListView = Backbone.View.extend({
initialize : function () {
_.bindAll(this, 'render');
this.template = Handlebars.compile($('#pre-sort-actions-template').html())
this.collection.bind('reset', this.render);
},
render : function () {
$(this.el).html(this.template({}));
this.collection.each(function (donorCorp) {
var donorCorpBinView = new DonorCorpBinView({
model : donorCorp,
list : this.collection
});
this.$('.donor-corp-bins').append(donorCorpBinView.render().el);
});
return this;
}
});
var DonorCorpBinView = Backbone.View.extend({
tagName : 'li',
className : 'donor-corp-bin',
initialize : function () {
_.bindAll(this, 'render');
this.model.bind('change', this.render);
this.template = Handlebars.compile($('#pre-sort-actions-donor-corp-bin-view-template').html());
},
render : function () {
var content = this.template(this.model.toJSON());
$(this.el).html(content);
return this;
}
})
// Routing
var App = Backbone.Router.extend({
routes : {
'' : 'home',
'pre-sort' : 'preSort'
},
initialize : function () {
// ...
},
home : function () {
// ...
},
preSort : function () {
if (donorCorps.length < 1) {
donorCorps.url = 'http://my/api/donor-corps';
donorCorps.fetch();
}
var donorCorpsList = new DonorCorpsListView({ collection : donorCorps }).render().el;
$('#document-action-panel').empty().append(donorCorpsList);
// ...
}
});
// Private members
var app;
var donorCorps = new DonorCorpsCollection();
// Public operations
return {
Init: function () { return init(); }
};
// Private operations
function init () {
app = new App();
Backbone.history.start({ root: '/myApp/', pushState: true });
docr.navigate('/', { trigger: true, replace: true});
}
}(myModule || {}));
Все работает нормально, когда я запускаю приложение... оно переходит к домашнему виду, как и ожидалось. У меня настроены ссылки с обработчиками для надлежащего перехода к различным маршрутам, и когда я запускаю app.navigate('pre-sort', { trigger: true, replace: true})
, он работает нормально и отображает ожидаемые элементы в списке, как и ожидалось.
Проблема возникает, когда я пытаюсь вернуться назад в исходное представление, а затем снова вернуться в представление предварительной сортировки... элементы в списке не отображаются на экране, как я ожидая их. Я просто получаю пустой pre-sort-actions-template
без добавления к нему дочерних представлений. Я просмотрел код и вижу, что коллекция заполнена и элементы есть... но по какой-то причине мой код не отображает их в представлении должным образом, и я не могу понять почему или что я делаю неправильно. Любые идеи?? Я новичок в backbone, поэтому я уверен, что этот код написан не совсем правильно... конструктивная обратная связь приветствуется. Спасибо.
DonorCorpsListView.render
, когдаthis.$
становится пустым в итераторе.each
? - person rjz   schedule 26.06.2012