Есть ли способ динамически изменить шаблон Marionette ItemView с помощью RequireJS?

Я пытаюсь динамически манипулировать itemViews в Marionette CollectionView. Коллекции имеют одинаковые модели, но я определил аргумент templateName внутри моделей.

Вопрос в том, могу ли я манипулировать шаблоном ItemView с помощью этого аргумента?

ЭлементВид:

define(['text!templates/ComponentItemViewTemplate.html','models/ComponentModel'], function (template, model) {
    var ItemView = Backbone.Marionette.ItemView.extend({
        template: _.template(template),
        model: model
    });

    return ItemView;
});

КоллекцияВид:

define(['views/ComponentItemView', 'views/LoadingView'], function(ItemView, LoadingView) {
    var ComponentListView = Backbone.Marionette.CollectionView.extend({
        emptyView : LoadingView,
        id: "component-list",
        itemView: ItemView, 
        events: {
            'click .title span' : 'show' 
        },
        appendHtml: function(collectionView, itemView, index){//i would like to render different templates, for different models.
            itemView.$el.draggable({ helper: "clone", cancel: ".component .title span", connectToSortable: ".ui-sortable" });
            collectionView.$el.append(itemView.el);
        },
        show: function(r) {
            var target = $(r.target);
            if( target.parent().hasClass('open') ){
                target.parent().removeClass('open');
                target.parent().next().slideDown('fast');
            }else{
                target.parent().addClass('open');
                target.parent().next().slideUp('fast');
            }
        }
    });

    return ComponentListView;
});

Спасибо!


person Robert Bokori    schedule 20.03.2013    source источник
comment
Я бы присвоил имя шаблона в ItemView с помощью функции getTemplate. github.com/marionettejs/backbone.marionette/blob/master/docs/   -  person Andrew Kirkegaard    schedule 21.03.2013
comment
И есть ли способ отобразить элемент представления после загрузки шаблона requirejs? Cose с вашим решением я получаю ошибку notetemplate до того, как потребуется шаблон. getTemplate: function() {require(['text!templates/' + this.model.get('editor_template') + '.html'], function(Template){return _.template(Template);});}   -  person Robert Bokori    schedule 21.03.2013


Ответы (3)


Вы можете переопределить функцию getTemplate и написать там свою собственную логику. Марионетка документация рекомендует следующий вариант:

MyView = Backbone.Marionette.ItemView.extend({
  getTemplate: function(){
    if (this.model.get("foo")){
      return "#some-template";
    } else {
      return "#a-different-template";
    }
  }
});
person kirill.buga    schedule 02.07.2013

Я думаю, что Гамболхед на правильном пути. Для этого вы можете переопределить функцию getTemplate.


MyCollectionView = Marionette.CollectionView.extend({

  // ...

  getItemView: function(item){
    // get the template from the item... or wherever else it comes from
    return new MyViewType({
      template: item.get("the-template")
    });
  }


});

Надеюсь, это делает то, что вам нужно

person Derick Bailey    schedule 21.03.2013

Прежде всего, я хотел бы поблагодарить всех, кто пытался мне помочь. Я решил свою проблему. Вот решение, если кому нужно:

define(['models/ComponentModel'], function (model) {

    var ItemView = Backbone.Marionette.ItemView.extend({
        model: model,
        render: function() {
            var that = this;
            var data = this.serializeData();

            require(['text!templates/components/editor/' + that.model.get('editor_template') + '.html'], function(Template){
                var html = _.template(Template, data);
                that.$el.html(html);
            });
        }
    });

    return ItemView;
});

отредактировано: (лучшее решение)

Предложения приветствуются!

person Robert Bokori    schedule 21.03.2013