【发布时间】:2014-07-06 17:52:04
【问题描述】:
我正在使用backbone.js 构建一个应用程序,并发现自己在模型视图的模板中拥有一个包含大量条件逻辑的视图。模型的type 属性用于确定要渲染的html。如果可能的话,我想避免这种逻辑,因为它很难阅读。我认为有几种方法可以解决这个问题(请注意,我在这里得到的实际模板非常简化):
1.集合视图而不是模型视图中的条件逻辑 - 多个子视图
我可以将作用于每个模型类型的条件逻辑放入集合视图中:
var CollectionView = Backbone.View.extend({
....
render: function() {
this.collection.each(function(thing) {
if(thing.get("type") === "wotsit") {
this.$el.append(new WotsitView({ model: thing });
} else if(thing.get("type") === "oojamaflip") {
this.$el.append(new OojamaflipView({ model: thing });
}
}, this);
},
....
}
优点 这样我就可以让每个子视图都有一个没有逻辑的模板方法,而只是构建 html。
var WotsitView = new Backbone.View.extend({
....
template: _.template('<h2>{{ title }}</h2>');
});
var OojamaflipView = new Backbone.View.extend({
....
template: _.template('<h3>{{ title }}</h3>');
});
缺点
问题是,集合中的things 都非常相似。每个thing 的事件 可能相同或非常相似,我可以看到有很多代码重复。我真的只希望这些子视图的实际模板与其他一切都相同。
2。模型视图中的条件逻辑 - 多种模板方法
var ModelView = Backbone.View.extend({
....
render: function() {
if(this.model.get("type") ==== "wotsit") {
this.$el.html(this.wotsitTemplate(this.model.attributes));
} else if(this.model.get("type") === "oojamaflip") {
this.$el.html(this.oojamaflipTemplate(this.model.attributes));
}
},
wotsitTemplate: _.template('<h2>{{ title }}</h2>'),
oojamaflipTemplate: _.template('<h3>{{ title }}</h3>')
});
优点 该模型只有一个视图。 所有事件等都是一个视图中的句柄,而不是被复制。
缺点 我其实很喜欢这种方式,但我很想听听其他人的选择。
【问题讨论】:
-
我强烈建议您查看 Marionette 或 Chaplin 源代码以获得有意义的答案。或者您可以将主干视图放在一起并使用支持复合视图的 React 或 Vue 库。主干视图组件是只是……不好。
-
@mpm 我真的很喜欢 Marionette。现在,我开始感觉到它并不像我想要的那样“强大”——我的意思是从代码的角度来看,而不一定是性能方面的。