Backbone - настройка el в функциях рендеринга?

0

Я работаю на веб-странице с помощью 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);
}
});
Теги:
backbone.js

1 ответ

1
Лучший ответ

Как насчет этого? Не изменяйте родительский динамически при рендеринге, а вместо этого выбирайте, какой дочерний 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);
}
});
  • 0
    Что-то не так с селектором в функции renderMenu :( Кроме этого, я думаю, что это отличная идея, я должен посмотреть, работает ли он
  • 0
    Ну, что не так? Сообщения об ошибках? Бревна? Не могу помочь, если ты не участвуешь ... PS: Там нет знака кавычки. Исправлен ответ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню