【发布时间】:2014-10-17 09:48:35
【问题描述】:
陷入了骨干路由器的陷阱。想象一下,我有 2 个主干路由器:
1) RootRouter - 只有一个路由和唯一的职责 - 使用 RequireJS 加载 subRouter 并实例化它。
var RootRouter = Backbone.Router.extend({
routes: {
'*all': 'invokeSubModule'
},
invokeSubModule: function(route, args) {
require(['SubRouter'], function(subRouter) {
new subRouter()
})
}
});
2) SubRouter - 带有路由哈希和处理程序的标准 BB 路由器。
var SubRouter = Backbone.Router.extend({
routes: {
'some/bar': 'doBar',
'some/foo': 'doFoo'
},
doBar: function() { ... },
doFoo: function() { ... }
});
我从some/bar URL 启动应用程序。
在启动时 RootRouter 实例化和 Backbone.History 启动。
正如预期的那样 RootRouter - 匹配任何 URL 并触发 invokeSubModule - 异步加载和 SubRouter 实例按预期工作,但问题与 some/bar 相关联 SubRouter 处理程序不会触发,因为页面 URL 与上一个相比没有变化route.
寻找解决方案我只找到了你在历史开始之前加载子路由器的情况的答案,但在我的情况下它没用。
所以经过一番挖掘后,我找到了解决方案 - 扩展 Backbone.Route 并覆盖 route 方法,以便在 Backbone.getHash() 等于操作的路由方法时调用处理程序。
Backbone.Router.extend({
route: function(route, name, callback) {
...
if (!callback) callback = this[name];
/* run handler immediately if route we add is the current URL fragment */
if(routeRegexp.test(Backbone.history.getHash()) ) {
this.execute(callback, this._extractParameters(routeRegexp, routeStr));
}
Backbone.history.route(route, function(fragment) {
....
});
return this;
}
})
所以我很困惑,这只是一个 hack,将来可能会导致错误。 因此,寻找解决此类问题的最佳实践并批评我的解决方案。
还期望回答如何在没有 RootRouter 的情况下管理路由器延迟加载,因为在这种情况下,不会触发第一个 route。
【问题讨论】:
-
您是否尝试像这样订阅
RootRouterroute事件:RootRouter.on("route:invokeSubModule", function(url) { SubRouter.navigate(url); })? -
它不会工作,因为
navigate不会触发回调,因为片段仍然相同。当前的解决方案有效,但我不确定它是否打破了主干思想,它不是再次发明自行车
标签: backbone.js