拥有类似'dogs': 'process'
的路线,我需要将其重写为'animals': 'process'
。
现在,我需要路由器识别这两个路由,但总是显示像/animals
这样的网址,它有点别名,但找不到任何关于如何解决这个问题的信息,而不会在{{1}中放置网址重定向{1}}处理程序。
答案 0 :(得分:2)
我假设对别名的真正需求与dogs
到animals
不同,所以无论这里的用例是否合适,我都会回答。但是如果您不想更改哈希但想要在应用程序中触发不同的行为,那么使用路由器可能不是可行的路径。
除了使用相同的回调定义不同的路由之外,Backbone 中并不存在路由别名。根据您的确切用例,有多种方法可以处理类似的路由。
要显示来自不同路由的通用路由的相同哈希值,请使用navigate
function的replace
选项。
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
选项会调用另一个路由器中的animalsRoute
,replace
选项将避免在历史记录中输入,因此按下后退按钮不会转到lions
回到animals
并被捕入动物路线。