陷入与骨干路由器的陷阱。想象一下,我有2个主干路由器:骨干多路由器陷阱 - 子路由器处理程序doesent调用
1)RootRouter - 只有一个路由和唯一的责任 - 加载带有RequireJS的subRouters并实例化它。
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;
}
})
所以我很困惑,这只是一个黑客攻击,并可能在未来造成可能的错误。 所以寻找最佳实践如何解决这个问题和批评我的解决方案。
同样期待尽可能的答案如何管理路由器没有RootRouter的延迟加载,因为在这种情况下,第一个route
不会被解雇。
你尝试订阅你这样的''RootRouter'事件route'如下:'RootRouter.on(“路线:invokeSubModule“,function(url){SubRouter.navigate(url); })'? – Dethariel 2014-10-24 10:07:44
它不会工作,因为'浏览'不会触发回调,因为片段仍然是相同的。目前的解决方案的工作原理,但我不知道它是否打破骨干思想,而不是自行车发明了 – Evgeniy 2014-10-24 10:59:00