2012-06-26 2 views
1

Позвольте мне сначала показать, в чем я нуждаюсь, чтобы вы могли понять мою проблему. У меня есть вид контакта, как:Магистраль: список видов внутри вида

ContactView = Backbone.View.extend({ 
    template: _.template("Name: <%= name %> 
          E-mail: <%= email %> 
          Phones 
          <%= label1 %> - <%= number1 %> 
          <%= label2 %> - <%= number2 %>"), 
    render: function() { 
     var contact = this.template(this.model.toJSON()); 
     this.$el.html(contact); 
    } 
}); 

До сих пор так хорошо, проблема заключается в том, что телефоны часть представляет собой список, моя модель содержит массив телефонов, и мне нужно поставить его динамически в этом шаблоне.

Что я думал о создании другой модели и просмотре телефона и PhoneView именно для этого. А потом в ContactView я бы создать метод render_phones, как:

render_phones: function() { 
    var phones = this.model.get('phones'); 
    var phones_str = ""; 
    for (var i in phones) { 
     var phone = new Phone(phones[i]); 
     var phoneView = new PhoneView({model: phone}); 
     phones_str += phoneView.render(); 
    } 
    return phones_str; 
} 

Я изменил шаблон ContactView к этому:

template: _.template("Name: <%= name %> 
         E-mail: <%= email %> 
         Phones 
         <%= phones %>"), 

Но как сделать мой метод визуализации получить список телефонов визуализации и положить внутри шаблона?

Я не мог найти шаблон для решения подобных ситуаций. И код начинает выглядеть не очень хорошо.

ps: Это всего лишь пример, есть несколько других частей моего приложения, которые мне нужны, представление, которое должно генерировать subviews с содержимым в списке.

+0

Я имею в виду, что метод визуализации уже имеет: this.template (this.model.toJSON()); Мне нужно было бы сделать цепочку телефонов частью модели, чтобы она отображалась в шаблоне. Но это было бы очень уродливым и (я думаю) неправильным способом сделать это. –

ответ

3

Похоже, вы используете underscore.js для визуализации своих шаблонов, underscore.js предоставляет способ для rendering a collection в шаблоне (посмотрите на второй пример). например

template: _.template("Name: <%= name %> 
          E-mail: <%= email %> 
          Phones 
       <% _.each(phones, function (phone) { %> 
       <%= label %> - <%= number %> 
       <% }); %>"), 

Вы также можете оказать индивидуальный вид для каждой модели и в том же рендеринга модели изменить el, чтобы сделать это, но если вам не нужно мнение (например, содержание изменится или вы прислушиваясь к событиям), вероятно, он не заплатит за это. Вот пример того, как можно достичь этого

render: function() { 
    this.$el.html(this.model.toJSON()); 
    _.each(this.model.get('phones'), function(phone) { 
    this.$el.find('.phoneArea').append(new phoneView({model: phone}).render().el)); 
    },this); 
    return this; 
} 

Кроме того, если вы должны были пойти по этому пути, то обратите внимание, что, вероятно, платить кэшировать мнения, но опять же, если все, что вам нужно, чтобы сделать содержание, то это было бы вероятно, заплатить, чтобы просто сохранить номера телефонов в виде массива и отобразить его в шаблоне.

+0

Спасибо большое! Я использовал первый пример, поскольку я нашел его более коротким и изящным, красивым! –

+0

Рад помочь, как я уже упоминал, если у вас нет причин использовать второй подход, вам, вероятно, лучше с первым. – Jack