Backbone / Marionette ItemView策略

时间:2013-08-15 10:08:32

标签: backbone.js marionette collectionview

我正在建立一个网站,其博客有一些特点。这是一种tumblr式的体验,其中有不同的后期类型:

  • 的Facebook-交
  • 引用
  • 文章
  • 研究

这些帖子共享一些常见属性,例如idtitlepost_datepost_url_slug,但有些属性有post_imagepost_external_link例如。这完全取决于post_typefacebook可以包含quotearticleMarionette.CollectionView等值。确定哪种类型的好策略是什么?渲染一个{{1}}并选择一个不同的tempalte或在模板中使用下划线的模板中的任意javascript处理它?任何意见都将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:6)

绝对不要将逻辑放在视图模板中。这将导致痛苦,痛苦,仇恨和黑暗的一面。 :P

您可以覆盖CollectionView或CompositeView上的getItemView方法,并使用它来确定所需的视图类型。 https://github.com/marionettejs/backbone.marionette/blob/master/src/marionette.collectionview.js#L122


var Stuff = Marionette.CollectionView.extend({
  // ...,

  getItemView: function(item){
    var type = item.get("whatever_field");
    var viewType;
    if (type === "some value"){
      viewType = SomeViewType;
    } else {
      viewType = AnotherViewType;
    }
    return viewType;
  }
});

答案 1 :(得分:1)

您应该只有一个ItemView,不需要覆盖CollectionView的getItemView。 ItemView应该是决定使用模板的人,这就是getTemplate的用途。它应该是这样的:

var MyItemView = Marionette.ItemView.extend({
    getTemplate: function() {
        var template;
        switch(this.model.get('type')) {
            case 'facebook':
                template = 'Template for Facebook type';
                break;
            case 'quote':
                template = 'Template for Quote type';
                break;
            case 'article':
                template = 'Template for Article type';
                break;
        }
        return template;
    }
});

这样,您只有一个ItemView用于您拥有的模型,渲染决策将保留给模板。

答案 2 :(得分:0)

您可以在ItemView初始化函数中处理此问题并在那里切换模板。只要您打算使用相同的事件交叉发布类型