Я работаю на веб-странице с помощью BackboneJS. Страница HTML содержит 2 divs, которые действуют как столбцы, и каждый элемент будет либо в первом столбце, либо на втором. Я не уверен, как установить элемент el
в виде коллекции. В настоящее время я устанавливаю его динамически в функции render
коллекции, но по некоторым причинам в правой колонке создано больше элементов (div). Вот код. Я делаю что-то неправильно? Есть ли лучший подход?
HTML-фрагмент:
<div class="columns" id="col1"></div>
<div class="columns" id="col2"></div>
Представление Backbone должно распространять элементы как в col1
col2
, так и в col2
, поэтому я не могу установить el
в виде коллекции, как обычно, я должен как-то его динамически установить.
Вот коллекция MenusView соответствующего вида:
var application = application || {};
application.MenusView = Backbone.View.extend({
//el: '#col1',
initialize: function(initialmenus) {
console.log("Initializaing MenusView");
this.collection = new application.Menus(initialmenus);
this.render();
},
render: function() {
var count = true;
this.collection.each(function(item) {
//setting el dynamically at rendering, so we can distribute divs to col1 and col2
this.setElement($('#col' + (count ? '1' : '2')));
count = !count;
this.renderMenu(item);
}, this);
},
renderMenu: function(item) {
var menuView = new application.MenuView({
model: item
});
this.$el.append(menuView.render().el);
}
});
Как насчет этого? Не изменяйте родительский динамически при рендеринге, а вместо этого выбирайте, какой дочерний DIV должен отображать.
<div class="columnWrapper">
<div class="columns"></div>
<div class="columns"></div>
</div>
var application = application || {};
application.MenusView = Backbone.View.extend({
// Your collection view "el" is now the wrapper div
el: "div.columnWrapper",
initialize: function(initialmenus) {
console.log("Initializaing MenusView");
this.collection = new application.Menus(initialmenus);
this.render();
},
render: function() {
var count = true;
this.collection.each(function(item) {
this.renderMenu(item, count);
count = !count;
}, this);
},
renderMenu: function(item, count) {
var menuView = new application.MenuView({
model: item
});
var childIndex = count ? 1 : 2;
this.$(".columns:nth-child(" + childIndex + ")").append(menuView.render().el);
}
});