陷入與骨幹路由器的陷阱。想象一下,我有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