在我的应用程序的许多地方发生以下模式:
我尝试了以下两种实现模式:
路由器处理提取
查看句柄获取
我不喜欢#1,因为路由器变成了模型/集合获取逻辑的巨大球,并且似乎有太多的责任.#2似乎是一个更好的职责分配(路由器只是决定要显示哪个视图,查看它需要获取哪些数据),但它确实使视图呈现有点棘手,因为它现在是有状态的.
StackOverflow社区的想法是什么?1,2还是其他什么?
小智 23
这篇文章很老了,但是我们今天早些时候正在审查它,所以如果有其他人遇到它:
对我来说,我真的看到两个不同的问题:
我们如何处理它与一些个人偏好混合:
我喜欢Yuri的要点,有几个警告(缩进的子弹):
渲染器的主要原因是处理与该部分相关的内容,例如清理现有视图以避免幻影视图,在渲染时滚动到顶部(我们的MainContentRenderer会这样做),或者在这种情况下显示微调器.
一个psuedo-code-ish的例子,可能是这样的:
路由器:
routes: {
"profile": "showProfile"
},
showProfile: function() {
return new ProfileController().showProfile();
}
Run Code Online (Sandbox Code Playgroud)
ProfileController可:
showProfile: function() {
//simple case
var model = new Model();
var deferredView = model.fetch.then(function() {
return new View(model);
};
MainContentRenderer.renderDeferred(deferredView);
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
介绍控制器还具有可测试性的额外好处.例如,我们有复杂的规则来执行URL管理搜索,在结果视图和新搜索视图之间进行选择,以及在缓存的"最后"搜索结果和执行新搜索之间进行选择.我们对控制器进行Jasmine测试,以验证所有流逻辑是否正确.它还提供了一个孤立的地方来管理这些规则.
我倾向于使用带有三个视图的第二个选项,即容器,加载视图和内容视图.也就是说,容器由路由器实例化,并且在每次渲染期间,它查看它现有的显示内容 - 有时由路由器提供,有时由自身提供 - 并决定实例化哪些视图.一个简单的,人为的例子:
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);
}
});
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方法,因为:
澄清: 在这种情况下,视图的目的是了解如何最好地向用户显示所显示的内容.在这种情况下,仍然可以使用加载视图最好地显示仍然加载的一些数据,而使用数据视图最好地显示就绪数据.大多数真实视图实际上是用更多视图组成它们的显示,例如,取决于用户授权不同的动作容器.