主干路由器初始化后不处理路由

时间:2013-08-09 15:40:34

标签: backbone.js router backbone-routing

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

// 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属性中找到它。我可以写一些代码来修复它,但我想我做错了,如果我必须编写这样的东西 - 我理解路由器应该在创建之后处理路由。

所以,问题:

  1. 为什么我的路由器在创建后没有处理当前网址的路由?也许我需要稍后开始骨干历史? (但是这个bug会在以后再次发生)

  2. 如何制作像/user/:id这样的参数的路线?

  3. 重建路由器也许是个不错的主意?也许最好一次创建所有这些?

  4. P.S。我试图创建两个路由器并保留它们,我也试图在创建所有路由器之后调用骨干历史记录启动方法..但这没有帮助:/

2 个答案:

答案 0 :(得分:2)

查看代码,似乎您在初始化任何路由之前就已经开始了主干历史记录。这很可能不会起作用。

执行此类分离的正确方法是根据从服务器收到的角色创建所有路由,然后启动主干历史记录。这是一个SO线程,它也与代码示例讨论它:How to protect routes for different user groups

答案 1 :(得分:2)

假设您的路线声明如下:

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

您的initialize代码无效,因为当您使用以下网址初始化路由器时:/user/1234Backbone.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});