有没有办法用Backbone捕获所有不匹配的路由?

evi*_*ery 41 javascript router backbone.js

我希望有一个'catch all'路由,当没有其他定义的路由匹配时,它会运行.一种404 NotFound错误处理程序.

我尝试添加此功能,但可以防止其他路由匹配:

this.route(/(.*)/, 'notFound', this.notFound);
Run Code Online (Sandbox Code Playgroud)

有没有人解决过这个问题?

evi*_*ery 83

在这里回答完整性.

你可以这两种方式做到这一点.使用route()问题定义正则表达式.但是,由于这个错误,您需要通过该route()方法定义所有路由,并以相反的顺序(在顶部捕获).这可以防止您使用路由哈希,因此(我的)首选方法是:

routes: {
  'users/search': 'searchUsers',
  'users/:id': 'loadUser',

  '*notFound': 'notFound'
}
Run Code Online (Sandbox Code Playgroud)

密钥'*notFound'实际上可以是任何开头的东西*.您只需要在之后使用字符*以防止解析错误.

  • 这个路由问题在Backbone中是一个很大的漏洞而且[他们仍然在做](https://github.com/documentcloud/backbone/blob/master/backbone.js#L932),JavaScript规范没有说明[以源顺序枚举的对象键](http://stackoverflow.com/a/10624559/479863)或除此之外的任何其他特定顺序在不同的地方将是相同的.取决于以任何特定顺序枚举的`routes`只是要求它.唯一可以确定的方法是手动使用`route()`. (11认同)

mac*_*ost 20

还有另一种,可以说更简单/更优雅的方法来解决这个问题. Backbone.History.start()根据路由是否匹配返回true或false.所以,如果你这样做:

if (!Backbone.history.start()) router.navigate('404', {trigger:true});
Run Code Online (Sandbox Code Playgroud)

而不是通常的:

Backbone.History.start();
Run Code Online (Sandbox Code Playgroud)

它将与其他答案具有相同的效果.

  • 但我相信只有在第一次加载页面时才会调用Backbone.History.start,因此如果导航到无效路由而不刷新页面,则无效. (11认同)
  • @evilcelery,好点.但是,当您的应用将用户重定向到不存在的页面时,会出现什么情况? (2认同)