我认为我不太了解正确使用Backbone路由器背后的想法。这是我得到的:
我有一些数据,我在页面加载时从服务器获取数据,然后将其打包到模型和集合中。这些模型和集合的数量是无限的。我想使用路由器能够直接从一开始渲染某个集合的视图。
问题是:Backbone路由器提前启动,因为我要求它访问某个视图并触发它 render
动作,它不能这样做,因为那些视图尚未创建。这意味着我实际上必须在获取完成后启动我的路由。
我不知道这是否是一种正确的方法,但我想出的唯一想法是:
- 包裹路线定义和
Backbone.history.start();
咬入一个单独的顶级可访问功能(即准备稍后手动调用它)。 - 运行该功能作为
success
回调我的收藏品fetch()
- 这些集合的数量是未知的,我也无法找出所有这些集合何时被提取,并且我不想多次启动这些路由。所以我利用了
_.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);
}});
},
});
所以我的问题是......我做得对吗?或者有更好的方法(必须)吗?