2012-06-27 97 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

這是我迄今發現,但是請記住,通過使用它,你搞亂解決這一問題的最優雅,最可靠的方法骨幹的內部。