我想要一个'全部捕捉'路线,当没有其他定义的路线匹配时运行。一种404 NotFound错误处理程序。有没有办法用Backbone捕获所有不匹配的路由?
我尝试添加这一点,这工作,但阻止匹配其他路线:
this.route(/(.*)/, 'notFound', this.notFound);
任何人之前解决这个问题?
我想要一个'全部捕捉'路线,当没有其他定义的路线匹配时运行。一种404 NotFound错误处理程序。有没有办法用Backbone捕获所有不匹配的路由?
我尝试添加这一点,这工作,但阻止匹配其他路线:
this.route(/(.*)/, 'notFound', this.notFound);
任何人之前解决这个问题?
在这里回答完整性。
您可以通过2种方法来完成。在问题中使用route()
定义正则表达式。但是,由于this bug,您需要通过route()
方法来定义所有路线,并以相反的顺序(最上面的搜索结果)。这可以防止您使用路由哈希,所以(我)最好的方法是:
routes: {
'users/search': 'searchUsers',
'users/:id': 'loadUser',
'*notFound': 'notFound'
}
关键'*notFound'
实际上可以是任何东西开始*
。您只需要*
之后的字符以防止出现分析错误。
只需将其添加为列表中的最后一条路线即可。这样它将只能作为后备选项进行匹配。
没有你的当前路由代码的例子,我会假设确保你抓住所有的路线是最后一个路线应该工作你
看起来你实际上需要添加它作为通过router.route()的_last_路由,这就是问题所在。看起来像一个错误,在这里提交:https://github.com/documentcloud/backbone/issues/1463 – evilcelery
@evilcelery:是的,如果你关心顺序,你必须使用'route()'添加路由,Backbone(历史上在至少)对对象的迭代顺序做出了一些无效的假设,JavaScript中没有对象键的一致排序。 –
糟糕的是我实际上得到了强调的单词错误,事实证明你现在需要通过'route()'将它添加为* first *路由。 – evilcelery
还有另一种,可以说更简单/更优雅的方法来解决这个问题。 Backbone.History.start()
根据是否匹配路线返回true或false。所以,如果你只是做:
if (!Backbone.history.start()) router.navigate('404', {trigger:true});
而不是通常的:
Backbone.History.start();
它会为其他的答案同样的效果。
这是如何被掩埋的? 'router.trigger'位已过时,但逻辑正确! http://backbonejs.org/#History-start – clayzermk1
如果你认为它应该是未被掩埋的,请随时注册这个答案:) – machineghost
但是我相信Backbone.History.start仅在页面首次加载时被调用,所以如果你导航到一个无效的路线,而不刷新页面,这将无法正常工作。 – evilcelery
这非常小的插件得到顺利完成任务:https://github.com/STRML/backbone.routeNotFound
这是我迄今发现,但是请记住,通过使用它,你搞乱解决这一问题的最优雅,最可靠的方法骨干的内部。
这个路由问题在Backbone中是一个很大的滑落,[他们仍然在做] (https://github.com/documentcloud/backbone/blob/master/backbone.js#L932),JavaScript规范没有提供任何关于[按源代码顺序枚举的对象键](http://stackoverflow.com/a/10624559/479863)或任何其他特定的顺序,而不是在各个地方都是相同的。取决于以任何特定顺序枚举的“路线”只是要求它。唯一确定的方法是手动使用'route()'。 –
非常感谢! :D –
感谢aaaand谢谢。 – wuliwong