查询Durandal路由器中的参数

时间:2013-03-25 22:02:19

标签: durandal

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

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

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

有没有人知道如何在没有routeinfo和路由器的情况下获取查询参数?出于好奇,为什么他们首先被添加而不是单独的论点?

1 个答案:

答案 0 :(得分: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对象,但如果您的查询字符串参数为routeInforoutersplat,则会发生错误。特别是如果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对象中,它将包含?分隔符之后的所有内容。

这会回答你的问题吗?