我正在建立一个网站,其博客有一些特点。这是一种tumblr式的体验,其中有不同的后期类型:
这些帖子共享一些常见属性,例如id
,title
,post_date
,post_url_slug
,但有些属性有post_image
或post_external_link
例如。这完全取决于post_type
,facebook
可以包含quote
,article
,Marionette.CollectionView
等值。确定哪种类型的好策略是什么?渲染一个{{1}}并选择一个不同的tempalte或在模板中使用下划线的模板中的任意javascript处理它?任何意见都将不胜感激。
谢谢!
答案 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初始化函数中处理此问题并在那里切换模板。只要您打算使用相同的事件交叉发布类型