在我的应用程序很多地方以下模式发生了:
- 用户点击某个环节触发导航
- 数据需要获取渲染视图
- UI设计需要一个“加载”微调器被示出,而数据被取出
- 一旦数据被取出我们展示了渲染视图
我曾尝试以下两个执行模式:
路由器把手取
- 路由器告诉容器视图来显示正在加载的旋转
- 路由器加载任何集合/模型
- 路由器告诉容器视图隐藏加载微调
- 路由器通过集合/模型视图,并使得它
视图处理取
- 路由器只是创建和呈现视图
- 该视图获取它需要的集合和模型
- 当视图第一次呈现,它只是显示加载微调,因为数据仍在加载
- 当数据到达时,该模型/集火事件和视图绑定到这些,因此重新呈现自身,从而隐藏加载微调和显示众目睽睽
我不喜欢#1,因为路由器成为型号/系列取逻辑的一个巨大的球,似乎有太多的责任。 #2好像责任更好地分配(路由器只是决定哪个视图显示,鉴于计算出它所需要的数据获取),但它确实使视图渲染有点麻烦,因为它现在是有状态的。
什么是StackOverflow的社会思考? 1,2,还是其他什么东西?
这个职位是很老,但我们今天早些时候进行审查,所以万一别人遇到它:
对我来说,我真的看到两个独立的问题:
- 数据获取的机制和结果视图渲染应该在哪里发生,在路由器或看法?
- 应该指望意见已经解决了模型,还是应该以任何可能仍然在加载模型回应?
我们如何处理它与一些个人喜好混合了一下:
- 都不是,虽然我瘦更接近路由器。 路由器应该处理路由,意见应办理查看和别的东西应该处理机制和型号/系列取逻辑的工作流程。 我们称之为别的东西控制器,其路由器基本上代表们。
- 成宥利暗示,“有时”是一个现实。 我想这大概是由案件的判决情况,但最终应是一个控制器和视图之间的合同,而不是路由器/视图之间。
我喜欢尤里的要点,与一对夫妇的注意事项(缩进子弹):
- 路由器只知道向何处发送用户
- 外观图只知道用户要观看(因为其数据)
- 假设外视图是特定于内视图的用例,并且由另一视图“拥有”(用于清理)
- 否则,对于普通的容器(如渲染成“主”的位置),我们发现它非常有用的管理一定“节”的意见,页面上的组件 - 我们称之为渲染
- 内部意见只知道如何表达自己的只有小部分的这一切(和可以在其他地方使用)
- 和渲染功能总是显示正确的事作为现在。
为渲染器的主要原因是处理与该节相关的东西,比如清理现有的意见,以避免鬼意见,滚动顶端上渲染(我们MainContentRenderer确实是),或表示在这种情况下,微调。
什么可能的样子,对于一个伪码上下的例子:
- 通用内容目标“主”(如果它是用特定的情况下,可能会更好用的ComponentView按照尤里的例子,这取决于你的观点生命周期管理策略)
- 一个模型中,我们必须获取并等待
- 接受已加载模型的图
路由器:
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();
}
}
介绍一个控制器还具有可测性的好处。 例如,我们周边的URL管理执行搜索,一个结果视图和一个新的搜索视图之间选择,并缓存“最后”的搜索结果之间的选择和执行新的搜索复杂的规则。 我们有茉莉花测试的控制器,以验证所有的流程逻辑是正确的。 它还提供了一个与世隔绝的地方来管理这些规则。
我倾向于使用第二个选项有三个观点,集装箱,装载视图和内容视图。 也就是说,容器是由路由器实例化,并在每个渲染它看起来什么它手头上显示,有时路由器提供,有时本身,并决定什么看法(S)来实例化。 一个简单的,人为的例子:
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);
}
});
我喜欢这种做法,因为:
- 路由器只知道向何处发送用户;
- 外视图仅知道用户应当查看的内容 (由于其数据);
- 内部意见只知道如何表达自己的只有小部分的这一切(和可以在别处使用); 和
- 渲染功能总是显示正确的事作为现在。
澄清:该视图的目的,在这种情况下,是要了解什么是必须表现出最好应该显示给用户。 在这种情况下,位数据仍在加载的最好用装载视图中示出,而准备数据最好用数据视图中示出。 最真实的观点实际上是构成它们的显示多了很多意见,例如,根据用户权限的不同动作的容器。
文章来源: Should the backbone router or view handle fetching data and displaying loading status?