我想要一個'全部捕捉'路線,當沒有其他定義的路線匹配時運行。一種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