您可以提前定义您的路由器;在您调用 Backbone.History.start() 之前它不会执行任何操作。
您可以在集合上绑定“重置”事件来启动历史记录,如下所示:
my_collection.bind("reset", _.once(Backbone.History.start, Backbone.History))
然后,当您的集合完全加载时,路由器将开始执行操作。我不确定这是否正是您正在寻找的(因为您提到拥有可变数量的集合)。
我也有类似的情况,只不过我在开始路由之前提前知道要加载哪些集合。我向路由器添加了一个 startAfter 方法,如下所示:
window.Workspace = new (Backbone.Router.extend({
. . .
startAfter: function(collections) {
// Start history when required collections are loaded
var start = _.after(collections.length, _.once(function(){
Backbone.history.start()
}))
_.each(collections, function(collection) {
collection.bind('reset', start, Backbone.history)
});
}
}));
然后在我设置好我的收藏之后
Workspace.startAfter([collection_a, collection_b, ...])
这也可以适应独立模型,尽管我认为您需要绑定到“重置”事件以外的其他内容。
我很高兴阅读您的示例代码,_.once 和 _.defer 的使用为我指明了正确的方向。