用querystring导航路线
将Backbone.Router.navigate
设置为true
test
:
var test = false; var Router = Backbone.Router.extend({ routes: { 'posts': 'showPosts' }, showPosts: function () { test = true; } }); router = new Router(); Backbone.history.start(); router.navigate('posts?foo=3', {trigger: true}); assert.ok(test);
例如,将posts?foo=3
片段默认匹配posts
路由,还是必须为此设置另一个路由,例如: posts?*querystring
?
谢谢
PS:我知道存在主干查询参数,但我只想知道主干。
您需要添加另一个具有期望参数的路由:
routes: { 'posts?foo=:foo' : 'showPosts', 'posts': 'showPosts' }, showPosts: function (foo) { if(typeof foo != 'undefined'){ // foo parameters was passed } test = true; }
更新
你可以定义一般路由来返回所有的查询string,然后在处理程序中parsing它:
routes: { 'posts': 'showPosts', 'posts?*queryString' : 'showPosts' }, showPosts: function (queryString) { var params = parseQueryString(queryString); if(params.foo){ // foo parameters was passed } } ... // and the function that parses the query string can be something like : function parseQueryString(queryString){ var params = {}; if(queryString){ _.each( _.map(decodeURI(queryString).split(/&/g),function(el,i){ var aux = el.split('='), o = {}; if(aux.length >= 1){ var val = undefined; if(aux.length == 2) val = aux[1]; o[aux[0]] = val; } return o; }), function(o){ _.extend(params,o); } ); } return params; }
更新2
这里有一个现场演示 ,看看在行动中的代码。
只是为了补充以前的答案,而不是定义两个具有相同callback的路线,如:
routes: { 'posts': 'showPosts', 'posts?*querystring': 'showPosts' }
你可以只有一个path来保持代码更清洁:
routes: { 'posts(?*querystring)': 'showPosts' }
骨干文档:
路由可以包含参数部分:param,它与斜线之间的单个URL组件匹配; 和splat parts * splat,可以匹配任意数量的URL组件。
如果你仍然想保持没有匹配的function,你可以定义两个路由
routes: { 'posts': 'showPosts', 'posts?*querystring': 'showPosts' } showPosts: function(querystring) { if (querystring) { // here you can parse your querystring, for your case the querystring variable is // 'foo=3' } //here you'll show posts according to the querystring (or lack thereof) }
这是另一个,仍然使用lodash(下划线)。 删除了_.map,添加了一些冗长的variables,并删除了开始“? 如果存在:
function parseQueryString(queryString) { if (!_.isString(queryString)) return queryString = queryString.substring( queryString.indexOf('?') + 1 ) var params = {} var queryParts = decodeURI(queryString).split(/&/g) _.each(queryParts, function(val) { var parts = val.split('=') if (parts.length >= 1) { var val = undefined if (parts.length == 2) val = parts[1] params[parts[0]] = val } }) return params }
RFC 3986“URI的语法”指出查询参数在哈希片段之前。
在URI中,哈希标记#引入URL末尾附近的可选片段。 URI的通用RFC 3986语法还允许通过问号?引入可选的查询部分。 在具有查询和片段的URI中,片段跟在查询之后。
我有这个问题处理redirect我从服务器即“ http://foo.com/main.html?error=errormessage#site ”。 我想路由查询,但不能看到一个方法来编写骨干路由expression式来处理这个URL。 现在我只是路由在散列,并通过parsinglocation.search来检查一个查询。