【发布时间】:2011-12-10 23:22:52
【问题描述】:
我认为我不太明白正确使用 Backbone 路由器背后的想法。这是我得到的:
我有一些数据在页面加载时从服务器获取,然后将其打包到模型和集合中。这些模型和系列的数量是不确定的。我希望使用路由器能够从一开始就直接渲染某个集合的视图。
问题是:骨干路由器启动得很早,因为我要求它访问某个视图并触发其render 操作,它不能这样做,因为这些视图尚未创建。这意味着我实际上必须在获取完成后启动我的路线。
我不知道这是否是正确的做法,但我想出的唯一想法是:
- 将路由定义和
Backbone.history.start();位包装到一个单独的顶级可访问函数中(即准备稍后手动调用它)。 - 将该函数作为我收藏的
fetch()的success回调运行 - 这些集合的数量是未知的,我也没有办法知道它们什么时候都被提取了,我不想多次启动路由。所以我使用
_.defer()和_.once()。
这可行,但它确实看起来很奇怪:
路由器:
window.startRoutes = _.once(function() {
var AccountPage = Backbone.Router.extend({
routes: {
'set/:id': 'renderSet',
},
renderSet: function(setId) {
/** … **/
// Call the rendering method on the respective CardView
CardsViews[setId].render();
}
});
var AccountPageRouter = new AccountPage;
Backbone.history.start();
});
收藏:
window.CardsCollection = Backbone.Collection.extend({
model: Card,
initialize: function(params) {
/** … **/
// Get the initial data
this.fetch({success: function() {
_.defer(startRoutes);
}});
},
});
所以我的问题是……我做得对吗?还是有更好的方法来做到这一点(必须)?
【问题讨论】:
-
为什么要立即进行ajax调用?为什么不简单地使用初始数据加载所需的 json 渲染页面并将数据传递到主干启动?
标签: routes logic backbone.js