0

我的应用程序中有多个路由器,通常看起来像这样:

// 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);
    }
};

它工作正常,除了一个错误:例如,当我使用带参数的路由时/reset-password-confirm/:code- 它无法在routes属性中找到。我可以编写更多代码来修复它,但我想我做错了,如果我必须编写这样的东西 - 据我所知,路由器应该在它创建后处理路由。

所以,问题:

  1. 为什么我的路由器在创建后不处理当前 url 的路由?也许我需要稍后开始骨干历史?(但这个错误稍后会再次发生)

  2. 如何使用参数制作路线,比如/user/:id在那里工作?

  3. 也许重新创建路由器是个坏主意?也许一次创建所有这些会更好?

PS我尝试创建两个路由器并保留它们,我也尝试在创建所有路由器后调用主干历史记录启动方法..但这没有帮助:/

4

2 回答 2

2

假设您的路线声明如下:

 routes : {
   '/user/:id' : 'user'
 }

您的initialize代码不起作用,因为当您使用以下网址初始化路由器时:/user/1234. Backbone.history.fragment将是/user/1234(不是/user/:id)。由于this.routes对象没有 键/user/1234,因此您的else子句调用default路由。

如果您首先实例化您的routerthen 调用Backbone.history.start(),您将能够删除您的路由器initialize代码。当您导航到一个 url 时,/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});
于 2013-08-09T17:20:58.950 回答
2

查看代码,您似乎在初始化任何路由之前就开始了主干历史。这很可能行不通。

进行这种分离的正确方法是根据从服务器接收到的角色创建所有路由,然后启动主干历史。这是一个 SO 线程,它也用代码示例讨论它:如何保护不同用户组的路由

于 2013-08-09T16:17:05.367 回答