2

我正在建立一个网站,其中包含一个有一些特点的博客。这是一种类似 tumblr 的体验,其中有不同的帖子类型:

  • 脸书贴
  • 引用
  • 文章
  • 研究

这些帖子有一些共同的属性,例如id, title, post_date, post_url_slug,但有些帖子有一个post_imagepost_external_link例如。这完全取决于post_type,它可以保存诸如facebook,等值。在呈现 a并完全选择不同的模板或在模板中使用下划线的任意 javascript 处理它时quotearticle确定它是哪种类型的好策略是什么?Marionette.CollectionView我的模板?任何输入将不胜感激。

谢谢!

4

3 回答 3

6

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

您可以覆盖getItemViewCollectionView 或 CompositeView 上的方法,并使用它来确定您想要的视图类型。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;
  }
});
于 2013-08-15T13:40:18.800 回答
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,并且渲染决策应该留给模板。

于 2013-08-15T13:49:17.430 回答
0

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

于 2013-08-15T13:36:57.930 回答