Backbone.js 使用querystring导航路线

Backbone.js 使用querystring导航路线,backbone.js,backbone-routing,Backbone.js,Backbone Routing,将主干网.路由器.导航设置测试到真: 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'

主干网.路由器.导航
设置
测试

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;
}
更新
您可以定义常规路由以返回所有查询字符串,然后在处理程序中解析它:

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

下面让我们来看看实际的代码。

主干文档:

路由可以包含参数部分:param,它在斜杠之间匹配单个URL组件;和splat parts*splat,可以匹配任意数量的URL组件

如果您仍然希望在不匹配的情况下保留功能,则可以定义两条路由

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(下划线)。删除了uz.map,在变量中添加了一些详细信息,并删除了开头的“?”(如果存在):

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
}

只是补充前面的答案,而不是定义具有相同回调的两条路由,如:

routes: {
    'posts': 'showPosts',
    'posts?*querystring': 'showPosts'
}
只有一条路径可以保持代码更干净:

routes: {
    'posts(?*querystring)': 'showPosts'
}
RFC3986“URI语法”规定查询参数应位于哈希片段之前

在URI中,hashmark#在URL末尾附近引入可选片段。URI的通用RFC 3986语法还允许使用问号?引入的可选查询部分?。在带有查询和片段的URI中,片段跟随查询


我在处理从服务器获得的重定向时遇到此问题,即“”。我想对查询进行路由,但看不到编写主干路由表达式来处理此url的方法。现在,我只是在散列上路由,并通过解析location.search来检查查询

?*
是否没有splat的名称
?*querystring
正常?这应该在主干网1中工作?Cz在我添加“?*查询”后,它不会触发任何路由操作。答案是差不多一年前做出的。但是文档或变更日志并没有暗示这不起作用的任何原因,我也有同样的问题。使用带有?*queryString的路由不仅不会捕获queryString变量,而且如果我使用了该变量而不是没有查询字符串的路由,则根本不会解释该路由。在一种情况下,首先定义最具体的路由(
posts?foo=:foo
),在另一种情况下定义第二个位置:顺序无关紧要?否,它不会影响路由的应用方式。这只是偏好的问题。顺便说一句,我已经测试并更新了这个功能,现在它工作得很好。我看到这个演示可以工作,但由于一些原因我仍然无法理解,这对我来说不起作用。使用这些路由构造,queryString总是未定义的。我知道问题是什么了-虽然您可以通过传递true来执行路由导航,但这仍然不能正确处理历史。此外,必须通过true才能导航并不理想,因为它需要我的路由器执行导航,而不是简单地执行解释的路由。这个答案与最初的问题相去甚远。。。现在,您的答案更像是如何解析查询字符串……我遇到了一个类似的问题。多亏了这一点,我应该更加注意,当您使用URI编码的查询参数时,整个查询字符串的匹配不起作用(例如,“foo=Max%20%26%20Moritz”)因为backbone.js只需要完整的路径片段,并且已经在每个路由参数上调用了decodeURIComponent。因此,以后解析查询字符串将无法正常工作。