37

Backbone.Router.navigate设置testtrue

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=3fragment 会默认匹配posts路由,还是我必须为此设置另一个路由,例如:posts?*querystring

谢谢

PS:我知道存在骨干查询参数,但我只想知道骨干。

4

5 回答 5

67

您需要使用该预期参数添加另一条路线:

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

这是一个现场演示,可查看实际代码。

于 2012-07-26T14:25:01.017 回答
18

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

routes: {
    'posts': 'showPosts',
    'posts?*querystring': 'showPosts'
}

您可能只有一种方法来保持代码更清洁:

routes: {
    'posts(?*querystring)': 'showPosts'
}
于 2014-02-14T18:24:29.443 回答
6

骨干文档:

路由可以包含参数部分,:param,它匹配斜杠之间的单个 URL 组件;和 splat 部分 *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)      
}
于 2012-07-26T14:34:14.007 回答
5

这是另一个镜头,仍然使用 lodash(下划线)。删除了 _.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
}
于 2013-06-11T14:10:25.450 回答
1

RFC 3986“URI 语法”规定查询参数应位于散列片段之前。

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

我在处理从服务器获取的重定向时遇到了这个问题,即“ http://foo.com/main.html?error=errormessage#site ”。我想对查询进行路由,但看不到编写主干路由表达式来处理此 url 的方法。现在我只是在哈希上路由并通过解析 location.search 来检查查询。

于 2015-02-13T20:50:44.717 回答