如何在Backbone路由器中进行路由别名?

时间:2017-02-20 09:55:15

标签: javascript backbone.js backbone-routing

拥有类似'dogs': 'process'的路线,我需要将其重写为'animals': 'process'

现在,我需要路由器识别这两个路由,但总是显示像/animals这样的网址,它有点别名,但找不到任何关于如何解决这个问题的信息,而不会在{{1}中放置网址重定向{1}}处理程序。

1 个答案:

答案 0 :(得分:2)

我假设对别名的真正需求与dogsanimals不同,所以无论这里的用例是否合适,我都会回答。但是如果您不想更改哈希但想要在应用程序中触发不同的行为,那么使用路由器可能不是可行的路径。

除了使用相同的回调定义不同的路由之外,Backbone 中并不存在路由别名。根据您的确切用例,有多种方法可以处理类似的路由。

替换哈希

要显示来自不同路由的通用路由的相同哈希值,请使用navigate functionreplace选项。

routes: {
    'lions': 'animalsRoute',
    'animals': 'animalsRoute'
},
animalsRoute: function() {
    this.navigate("#/animals", { replace: true });
    // or using the global history object:
    // Backbone.history.navigate("#/animals", { replace: true });
}

然后处理动物路线,无论最初使用哪条路线进入此回调。

其他一些答案或教程会说使用window.location.hash但不会。手动重置哈希将触发路由,无论如何都可能导致更多麻烦。

不同的行为,但显示相同的路线

使用不同的回调,都使用上面的替换技巧。

routes: {
    'lions': 'lionsRoute',
    'tigers': 'tigersRoute'
},
showGenericRoute: function() {
    this.navigate("#/animals", { replace: true });
},
tigersRoute: function() {
    this.showGenericRoute();
    // handle the tigers route
},
lionsRoute: function() {
    this.showGenericRoute();
    // handle the lions route
}

注意不存在的animalsRoute。如果没有选择特定动物,则可以添加路线(

使用路线参数

如果您想知道选择了哪只动物但仍然使用相同的回调并从哈希中删除所选动物,请使用route params

routes: {
    'animals/:animal': 'animalsRoute',
},
animalsRoute: function(animal) {
    // removes the animal from the url.
    this.navigate("#/animals", { replace: true });

    // use the chosen animal
    var view = new AnimalView({ type: animal });
}

重定向到通用路由

如果您想要不同的行为但始终显示相同的路线,请使用不同的回调,然后重定向。如果通用路由在另一个路由器实例中,这很有用。

var Router = Backbone.Router.extend({
    routes: {
        'animals': 'animalsRoute'
    },
    animalsRoute: function() {
        // handle the generic behavior.
    }
});

var PussyRouter = Backbone.Router.extend({
    routes: {
        'lions': 'lionsRoute'
        // ...
    },
    lionsRoute: function() {
        // handle lions, then redirect
        this.navigate("#/animals", { trigger: true, replace: true });
    }
});

使用trigger选项会调用另一个路由器中的animalsRoutereplace选项将避免在历史记录中输入,因此按下后退按钮不会转到lions回到animals并被捕入动物路线。