在我的应用程序的许多地方发生以下模式:
我尝试了以下两种实现模式:
路由器处理提取
查看句柄提取
我不喜欢#1,因为路由器变成了模型/集合获取逻辑的巨大球,并且似乎有太多的责任。 #2似乎是一个更好的职责分配(路由器只是决定要显示哪个视图,查看它需要获取哪些数据),但它确实使视图渲染变得有点棘手,因为它现在是有状态的。
StackOverflow社区的想法是什么? 1,2,还是别的什么?
答案 0 :(得分:23)
这篇文章很老了,但我们今天早些时候正在审核它,所以如果有其他人遇到它:
对我来说,我真的看到了两个不同的问题:
我们如何处理它与某些个人偏好相结合:
我喜欢Yuri的要点,有几个警告(缩进的子弹):
渲染器的主要原因是处理与该部分相关的内容,例如清理现有视图以避免幻影视图,在渲染时滚动到顶部(我们的MainContentRenderer会这样做),或者在这种情况下显示微调器。
psuedo-code-ish示例,可能是:
路由器:
routes: {
"profile": "showProfile"
},
showProfile: function() {
return new ProfileController().showProfile();
}
ProfileController:
showProfile: function() {
//simple case
var model = new Model();
var deferredView = model.fetch.then(function() {
return new View(model);
};
MainContentRenderer.renderDeferred(deferredView);
}
MainContentRenderer:
var currentView;
renderDeferred: function(deferredView) {
showSpinner();
deferredView.then(function(view) {
this.closeSpinner();
this.closeCurrentView();
this.render(view);
}
},
render: function(view) {
currentView = view;
$('#main-content').html(view.render().el);
}
closeCurrentView: function() {
if (currentView and currentView.close()) {
currentView.close();
}
}
介绍Controller还具有可测试性的附加好处。例如,我们有复杂的规则来执行URL管理搜索,在结果视图和新搜索视图之间进行选择,以及在缓存的“最后”搜索结果和执行新搜索之间进行选择。我们对控制器进行Jasmine测试,以验证所有流逻辑是否正确。它还提供了一个孤立的地方来管理这些规则。
答案 1 :(得分:7)
我倾向于使用带有三个视图的第二个选项,即容器,加载视图和内容视图。也就是说,容器由路由器实例化,并且在每次渲染期间,它查看它现有的显示内容 - 有时由路由器提供,有时由自身提供 - 并决定实例化哪些视图。一个简单的,人为的例子:
ContainerView = Backbone.View.extend({
initialize: function (options) {
options.data.bind("reset", this.render, this);
},
render: function () {
var view;
// If the loading view is only shown once, e.g., splashing, then isReady()
// may be better here.
if (this.options.data.isLoading()) {
view = LoadingView;
} else {
view = DataView;
}
this.$("div.content").html(new view().render().el);
}
});
我喜欢这种方法,因为:
澄清: 在这种情况下,视图的目的是了解如何最好地向用户显示所显示的内容。在这种情况下,仍然可以使用加载视图最好地显示仍然加载的一些数据,而使用数据视图最好地显示就绪数据。大多数真实视图实际上是用更多视图组成他们的显示,例如,取决于用户授权不同的动作容器。