【问题标题】:Is there a way to change Marionette ItemView template dynamically with RequireJS?有没有办法使用 RequireJS 动态更改 Marionette ItemView 模板?
【发布时间】:2013-03-20 22:37:31
【问题描述】:

我正在尝试在 Marionette CollectionView 中动态操作 itemView。这些集合具有相同的模型,但我在模型中定义了 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;
});

谢谢!

【问题讨论】:

  • 我会使用getTemplate 函数在ItemView 中分配模板名称。 github.com/marionettejs/backbone.marionette/blob/master/docs/…
  • 有没有办法在requirejs加载模板后渲染itemview?在需要模板之前,根据您的解决方案,我得到 notemplate 错误。 getTemplate: function() {require(['text!templates/' + this.model.get('editor_template') + '.html'], function(Template){return _.template(Template);});}

标签: backbone.js requirejs marionette


【解决方案1】:

您可以覆盖 getTemplate 函数并在那里编写您的自定义逻辑。 Marionette documentation recommends 以下选项:

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

【讨论】:

    【解决方案2】:

    我认为口香糖头是在正确的轨道上。您可以覆盖 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")
        });
      }
    
    
    });
    

    希望它能满足你的需要

    【讨论】:

      【解决方案3】:

      首先,我要感谢所有试图帮助我的人。 我解决了我自己的问题。 如果有人需要,这是解决方案:

      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;
      });
      

      已编辑:(更好的解决方案)

      欢迎提出建议!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多