バックボーン ルーティングとクエリ パラメータは、不幸な組み合わせです。問題は、この GitHub の問題に詳しく記載されています。
核となる問題は、Backbone.Router
URL ハッシュ フラグメントと pushState API で動作するように設計されていることです。ハッシュ URL を使用する場合、クエリ文字列はハッシュに先行し、ルートで一致することはありません。pushState では、クエリ文字列は URL フラグメントの一部であり、別のルート式が必要です。
routesearch
があり、その route はオプションでパラメータ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"
これにより、サードパーティのクエリ文字列ライブラリやブラウザーの互換性について心配する必要がなくなります。私に言わせれば、後者のタイプの URL もすっきりしているように見えます。