9

我有一条具有查询参数的路线。激活视图时,会收集查询参数并将其传递给服务器端请求。我不知道参数是什么。我只是将它们传递给服务器进行处理。

在我的 viewmodel activate 方法中,context 参数是一个包含查询参数的对象,外加两个额外项:routeInfo 和 router。Durandal 将这些添加到查询参数中。首先,我不希望那些传递到服务器端。其次,如果我的查询参数也包含这两个名称,那么它们会被覆盖。

我查看了路由器代码并找到了将它们添加到我的参数的位置(在 dequeueRoute 中),但找不到阻止添加的方法,也没有办法在没有它们的情况下仅获取我的查询参数。

有谁知道我如何在没有路由信息和路由器的情况下获取查询参数?出于好奇,为什么首先添加它们而不是单独的参数?

4

1 回答 1

10

你的权利。我继续测试你的说法,似乎所有查询字符串参数都被写入上下文参数。

所以如果你有这样的路线:

http://www.somesite.com/#/services/?routeInfo=value1&router=value2&param1=value3

在您的激活方法中:

define(function() {
   return {
     activate: function(context) {
        console.log(context);
     }
   };
});

然后context将是一个json对象:

{ 
   routeInfo: {...}, // info object of moduleId and such
   router: {...}, // reference to the router.js pluggin
   param1: 'value3',
   splat: ['?routeInfo=value1&router=value2&param1=value3']
}

因此,查询字符串参数正在写入context对象,但如果您的查询字符串参数是routeInfo, router,否则splat会发生不好的事情。特别是如果它splat

所以,我想只是不要使用这些参数..

此外,如您所见,您的查询字符串参数被传递给 splat 对象。您可以通过执行以下操作轻松解析查询字符串:

function parsePlease(queryString) {
   var obj = {};
   var splitV = queryString.split('&');
   for (var i = 0, max = splitV.length; i< max; i++) {
      obj[splitV[i].split('=')[0]] = splitV[i].split('=')[1];
   }
   return obj;
}

类似的东西。你可能想改进它..我只是把它搅了起来。

此外,您还可以从window.location对象获取查询字符串参数。从window.location.search对象中,它将包含分隔符之后的所有内容?

这能回答你的问题吗?

于 2013-03-26T00:40:08.963 回答