我希望有一个'catch all' 路由,该路由在没有其他定义的路由匹配时运行。一种 404 NotFound 错误处理程序。
我试过添加这个,它可以工作,但会阻止其他路由匹配:
this.route(/(.*)/, 'notFound', this.notFound);
以前有人解决过这个问题吗?
我希望有一个'catch all' 路由,该路由在没有其他定义的路由匹配时运行。一种 404 NotFound 错误处理程序。
我试过添加这个,它可以工作,但会阻止其他路由匹配:
this.route(/(.*)/, 'notFound', this.notFound);
以前有人解决过这个问题吗?
为了完整起见,在这里回答。
你可以通过两种方式做到这一点。使用 定义正则表达式route()
,如问题中所示。但是,由于这个错误,您需要通过该route()
方法定义所有路由,并且以相反的顺序(顶部的总括)。这会阻止您使用路由哈希,因此(我的)首选方法是:
routes: {
'users/search': 'searchUsers',
'users/:id': 'loadUser',
'*notFound': 'notFound'
}
键'*notFound'
实际上可以是任何以*
. 您只需要在 之后的字符*
来防止解析错误。
还有另一种可以说更简单/更优雅的方法来解决这个问题。 Backbone.History.start()
根据是否匹配路由返回真或假。所以,如果你这样做:
if (!Backbone.history.start()) router.navigate('404', {trigger:true});
而不是通常的:
Backbone.History.start();
它将与其他答案具有相同的效果。
这个非常小的插件完成了它的工作:https ://github.com/STRML/backbone.routeNotFound
这是迄今为止我发现的解决此问题的最优雅和最强大的方法,但是请记住,使用它会弄乱 Backbone 的内部结构。
如果没有您当前路由代码的示例,我会假设确保您的全部路线是最后一条路线应该适合您
只需将其添加为列表中的最后一条路线即可。这样它只会被匹配为后备选项。
您可以像这样将其破解到主干:
var _loadUrl = Backbone.history.loadUrl;
Backbone.history.loadUrl = function (fragment) {
var result = _loadUrl.apply(Backbone.history, fragment);
// the loadUrl returns false if no route was found.
if(!result){
// call 404 route on router if it exists.
var handler = Backbone.history.handlers.filter( o => o.route.test("404") )
if(handler.length) {
Backbone.history.navigate("/404")
}
}
}
然后在您的路由器中,您可以这样做:
var Router = Backbone.Router.extend({
routes: {
"404": "pageNotFound"
},
pageNotFound: function () {
alert("trigger pageNotFound route")
}
});
我觉得这个不应该通过javascript来解决,应该是语言来解决,比如php。在服务器端处理文字,只要有条件就可以响应header错误号404