【发布时间】:2012-02-24 20:06:46
【问题描述】:
根据 MVC,模型是一种“纯”数据表示。您不希望其中包含演示性或非 DRY 数据。例如,如果您的模型有一个“comment_count”字段,它不应该还包含一个“use_plural”字段,这样您就可以知道是打印“comment”还是“cmets”。
This post has 0 comments
This post has 1 comment
This post has 2 comments
...
如果您将这些信息放在模型中,那么关注点分离会很糟糕,但是,另一种方法是在视图中派生该信息。例如:
var FooView = Backbone.View.extend({
render: function(){
this.data = this.model.toJSON();
this.data.use_plural = this.data.comment_count === 1;
// and fifty more lines like the above
$(this.el).html(ich['foo_template'](this.data));
}
});
我的问题是,似乎需要中间数据,这些数据太具有视图性而无法成为模型的一部分,但又太具有模型性而无法成为视图的一部分。这就是 MVVM 的地址吗?我查了一下,但它似乎非常特定于 Microsoft-tech-stack-specific。我正在考虑将它放入一个函数并从 render() 方法中调用它:
function deriveData(model){
var data = model.toJSON();
data.use_plural = data.comment_count === 1;
// and fifty more lines like the above
return data;
}
var FooView = Backbone.View.extend({
render: function(){
this.data = deriveData(this.model);
$(this.el).html(ich['foo_template'](this.data));
}
});
var BarView = Backbone.View.extend({
render: function(){
this.data = deriveData(this.model);
$(this.el).html(ich['bar_template'](this.data));
}
});
另一个想法是拥有一个 AbstractView 类并从它继承,如下所示:
var AbstractView = Backbone.View.extend({
deriveData: function(){
this.data = this.model.toJSON();
this.data.use_plural = this.data.comment_count === 1;
// and fifty more lines like the above
}
});
var FooView = AbstractView.extend({
render: function(){
this.deriveData();
$(this.el).html(ich['foo_template'](this.data));
}
});
var BarView = AbstractView.extend({
render: function(){
this.deriveData();
$(this.el).html(ich['bar_template'](this.data));
}
});
这并不是我被难住了,我只是想确保我不会在无知中随波逐流,而有一种很棒的方法可以解决这个确切的问题。有没有人有任何建议或想法,或者我可以在这里利用成熟的模式吗?谢谢。
【问题讨论】:
-
此外,我应该提到,模板通常具有执行此类操作的嵌入式逻辑,但使用无逻辑模板是不可能的,而且由于各种原因,我宁愿避免这样做。
标签: javascript model-view-controller backbone.js