2012-06-27 56 views

回答

78

在这里回答完整性。

您可以通过2种方法来完成。在问题中使用route()定义正则表达式。但是,由于this bug,您需要通过route()方法来定义所有路线,并以相反的顺序(最上面的搜索结果)。这可以防止您使用路由哈希,所以(我)最好的方法是:

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

    '*notFound': 'notFound' 
} 

关键'*notFound'实际上可以是任何东西开始*。您只需要*之后的字符以防止出现分析错误。

+11

这个路由问题在Backbone中是一个很大的滑落,[他们仍然在做] (https://github.com/documentcloud/backbone/blob/master/backbone.js#L932),JavaScript规范没有提供任何关于[按源代码顺序枚举的对象键](http://stackoverflow.com/a/10624559/479863)或任何其他特定的顺序,而不是在各个地方都是相同的。取决于以任何特定顺序枚举的“路线”只是要求它。唯一确定的方法是手动使用'route()'。 –

+0

非常感谢! :D –

+0

感谢aaaand谢谢。 – wuliwong

0

只需将其添加为列表中的最后一条路线即可。这样它将只能作为后备选项进行匹配。

-18

我认为这不应该通过JavaScript来解决,应该是解决的语言,例如php。在服务器端处理单词,只要你有条件,你可以回应头错误号码404

+0

这涉及使用'hashs/hashbangs/pushstate'的客户端路由。服务器端不是答案。 – Trevor

+0

@Trevor问题不在于客户端如果要与服务器进行交互,那不是静态页面,怕是没有意义。 – Myd

+6

我想你可能想在你尝试回答有关它的问题之前先阅读一些关于客户端URL路由的知识:http://documentcloud.github.com/backbone/#Router –

1

没有你的当前路由代码的例子,我会假设确保你抓住所有的路线是最后一个路线应该工作你

+1

看起来你实际上需要添加它作为通过router.route()的_last_路由,这就是问题所在。看起来像一个错误,在这里提交:https://github.com/documentcloud/backbone/issues/1463 – evilcelery

+1

@evilcelery:是的,如果你关心顺序,你必须使用'route()'添加路由,Backbone(历史上在至少)对对象的迭代顺序做出了一些无效的假设,JavaScript中没有对象键的一致排序。 –

+1

糟糕的是我实际上得到了强调的单词错误,事实证明你现在需要通过'route()'将它添加为* first *路由。 – evilcelery

18

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

if (!Backbone.history.start()) router.navigate('404', {trigger:true}); 

而不是通常的:

Backbone.History.start(); 

它会为其他的答案同样的效果。

+0

这是如何被掩埋的? 'router.trigger'位已过时,但逻辑正确! http://backbonejs.org/#History-start – clayzermk1

+0

如果你认为它应该是未被掩埋的,请随时注册这个答案:) – machineghost

+11

但是我相信Backbone.History.start仅在页面首次加载时被调用,所以如果你导航到一个无效的路线,而不刷新页面,这将无法正常工作。 – evilcelery

2

这非常小的插件得到顺利完成任务:https://github.com/STRML/backbone.routeNotFound

这是我迄今发现,但是请记住,通过使用它,你搞乱解决这一问题的最优雅,最可靠的方法骨干的内部。