骨幹路由和查詢參數是一個不幸的婚姻。問題在this GitHub issue中有詳細記錄。
核心問題是Backbone.Router
被設計爲與URL散列片段以及pushState API一起工作。使用散列URL時,查詢字符串位於散列之前,並且在路由中從不匹配。使用pushState,查詢字符串是URL片段的一部分,並且需要不同的路由表達式。
假設你有一個路線search
,並且路線將可選帶參數q
,sort
和type
。作爲查詢字符串看起來像:
search?q=kittens&sort=asc&type=images
的問題是,對於老的瀏覽器用戶,骨幹將恢復到hashchange
基於路由和路由將成爲:
?q=kittens&sort=asc&type=images#search
的您使用的插件嘗試解決此問題,但不能解決核心問題。
如果可能,您應該考慮不使用查詢字符串,並在路由表達式中使用可選片段傳遞任何狀態信息。接着前面的例子航線將成爲:
//pushState
search/q/kittens/sort/asc/type/images
//hash fragment
#search/q/kittens/sort/asc/type/images
使用(optional)
線路零件和:captures
(docs),你可以代表此URL與下面的表達式:
var Router = Backbone.Router.extend({
routes: {
"search(/q/:query)(/sort/:sort)(/type/:type)": "search"
},
search: function(query, sort, type) {
console.log(query, sort, type); //-> "kittens", "asc", "images"
}
});
只要路線片段中按照指定的順序,這將匹配沒有,任何和所有參數的URL,例如:
search //-> undefined, undefined, undefined
search/q/kittens/type/images //-> "kittens", undefined, "images"
search/sort/asc/type/images //-> undefined, "asc", "images"
該W您不必擔心第三方查詢字符串庫或瀏覽器兼容性問題。如果你問我,後一種類型的URL看起來更乾淨。
編輯:我使用的是https://github.com/jhudson8/backbone-query-parameters插件。 – TIMEX 2013-03-02 23:42:30
你能否讓問題更清楚一點?你想在每次導航到另一個頁面時清空'location.search'? – 2013-03-03 22:56:05
在[github](https://github.com/jhudson8/backbone-query-parameters/issues/29)上似乎也發佈了一個關於2天前發佈的問題,作者似乎沒有在該功能上工作。 – Starx 2013-03-03 23:05:48