根据MVC,模型是一种“纯粹的”数据表示。您不需要表示或非DRY数据。例如,如果您的模型有“comment_count”字段,则它不应包含“use_plural”字段,以便您可以知道是否打印“评论”或“评论”。
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解决的问题吗?我查了一下,但它看起来非常像微软技术堆栈。我正在考虑将它放入一个函数并从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));
}
});
这并不是因为我难倒,我只是想确保我不会在无知中漂浮,而有这种令人敬畏的方法可以解决这个问题。有没有人有任何建议或想法,或者我可以在这里利用完善的模式吗?感谢。
答案 0 :(得分:4)
这是一种个人观点(即使它来自长期经验并且被许多人分享),所以请耐心等待。
MVC模式真的不适合网络。问题似乎总是存在于 Controller 中。许多已经存在一段时间的人知道这一点并默默地接受它。大多数框架使用术语MVC作为分类,因为很好地,在模式术语中解释框架的目标是什么,以及大多数其他类似的框架使用该术语。
如果你真的需要在Backbone中附加一个含义 View 以及谁是 Controller ,那么大多数人都认为它们都是View。视图生成模板,但也会将事件从UI调度到模型,反之亦然。如果你真的需要将它们分开,你也可以认为View类是 Controllers ,模板是 Views 。
希望你明白这一点:你称之为什么并不重要。虽然你如何使用它很重要。
关于问题的实际部分:
我会根据具体情况使用其中任何一种。你曾经使用过的小东西吗?在render
内进行。是一些逻辑恰好是您的View架构的一部分,在多个视图中是否需要?从基类派生。与其他一切相同。