2016-01-29 3 views
0

У меня есть модель, у которой есть массив, позволяющий называть их блоки. Все блоки имеют атрибут block-header. В зависимости от того, какой атрибут блока-заголовка у меня есть, мне нужно управлять представлением/моделью по-другому. Поэтому им интересно, как я мог бы использовать композитный или коллекционный вид в marrionette для визуализации коллекции блоков, используя разные шаблоны в зависимости от заголовка блока в каждой модели.Как динамически выбирать вид элементов для моделей в Marrionette Composite View

Моя текущая работа вокруг, как это:

App.view.external_report.TemplateSetup = Marrionette.CompositeView.extend({
 
 
    __name__: 'ExternalReport$TemplateSetup', 
 
    template: 'external_report/templatesetup', 
 
    className: 'external-report', 
 
    super: App.view.CompositeView.prototype, 
 
    id: 'template-setup', 
 
    events: {
 
 
    'click #cancel': 'cancel', 
 
    'click #save': 'save'
 
 
    }, 
 
    initialize: function(options) {
 
 
    if (!this.model || !this.model.get('template')) throw 'No model or template found';

 
 
    var templateObj = JSON.parse(this.model.get('template'));
 
 
    var blocks = templateObj.SubBlocks;
 
 
    this.blockViews = [];
 
 
    _.each(blocks, function(block) {
 
 
     var model = new Backbone.Model(block);
 
 
     this.blockViews.push(new App.view.external_report.blocks.BaseBlock({ 
 
     model: model 
 
     }))
 
 
    }.bind(this));
 
 
    }, 
 

 
    onRender: function() {
 
 
    _.each(this.blockViews, function(blockView) {
 
 
     blockView.render().then(function() {
 
 
     this.$el.append(blockView.$el);
 
 
     }.bind(this));
 
 
    }.bind(this));
 
 
    }, 
 

 
    save: function() {
 
 
    this.model.set('template', JSON.stringify(this.generateTemplate()));
 
 
    this.model.save().then(function() { 
 
     //placeholder 
 
    }.bind(this)); 
 
    }, 
 

 

 
    generateTemplate: function() {
 
 
    var template = JSON.parse(this.model.get('template'));
 
 
    template.SubBlocks = [];
 
 
    _.each(this.blockViews, function(blockView) {
 
 
     template.SubBlocks.push(blockView.generateBlockJSON());
 
 
    }.bind(this));

 
 
    return template;
 
 
    } 
 
});

+0

Возможный дубликат [Магистраль макинтошей разных композитных видов] (http://stackoverflow.com/questions/18684567/backbone-marionette-different-composite-views) –

ответ

2

Я думаю, вы должны создать два ItemViews и переписать функцию getChildView выбрать ItemView, который вы хотите визуализировать.

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