我的应用中有多个路由器,通常看起来像这样:
// Start backbone.js
if (!Backbone.History.started) {
Backbone.history.start({pushState: true, hashChange: false});
}
// Perform some RPC requests ...
// Depending on user role, received from the server should be created suitable router:
var router;
if (typeof app.user.role === 'manager') {
router = new routers.manager();
} else {
router = new routers.guest();
}
问题是在加载页面并执行脚本之后,路由器不会这样做。任何东西。它们不会自动为当前URL加载路由。所以,我必须以这种方式修复它(我不确定它是否正确):
routers.guest.initialize = routers.manager.initialize = function() {
var defaultRoute = 'default';
if (typeof this.routes[Backbone.history.fragment] !== 'undefined') {
this[this.routes[Backbone.history.fragment]]();
} else {
this.navigate(defaultRoute, true);
}
};
它工作正常,除了一个错误:当我使用带有params的路由时,例如/reset-password-confirm/:code
- 它无法在routes
属性中找到它。我可以写一些代码来修复它,但我想我做错了,如果我必须编写这样的东西 - 我理解路由器应该在创建之后处理路由。
所以,问题:
为什么我的路由器在创建后没有处理当前网址的路由?也许我需要稍后开始骨干历史? (但是这个bug会在以后再次发生)
如何制作像/user/:id
这样的参数的路线?
重建路由器也许是个不错的主意?也许最好一次创建所有这些?
P.S。我试图创建两个路由器并保留它们,我也试图在创建所有路由器之后调用骨干历史记录启动方法..但这没有帮助:/
答案 0 :(得分:2)
查看代码,似乎您在初始化任何路由之前就已经开始了主干历史记录。这很可能不会起作用。
执行此类分离的正确方法是根据从服务器收到的角色创建所有路由,然后启动主干历史记录。这是一个SO线程,它也与代码示例讨论它:How to protect routes for different user groups
答案 1 :(得分:2)
假设您的路线声明如下:
routes : {
'/user/:id' : 'user'
}
您的initialize
代码无效,因为当您使用以下网址初始化路由器时:/user/1234
。 Backbone.history.fragment
将为/user/1234
(不是/user/:id
)。由于this.routes
对象没有/user/1234
的密钥,因此您的else
子句会调用default
路由。
如果您首先实例化router
,然后拨打Backbone.history.start()
,则可以删除路由器initialize
代码。当您导航到/user/1234
的网址时,您的路由器将匹配/user/:id
路由并调用user
功能。
以下内容适用于您而无需添加initialize
代码:
var router = (app.user.role === 'manager') ? new routers.manager()
: new routers.guest();
Backbone.history.start({pushState: true, hashChange: false});