我有一个包含查询参数的路由。激活视图时,将收集查询参数并将其传递给服务器端请求。我不知道参数是什么。我只是将它们传递给服务器进行处理。
在我的viewmodel activate方法中,context参数是一个包含查询参数的对象,另外还有两个额外的项:routeInfo和router。 Durandal将这些添加到查询参数中。首先,我不希望那些传递到服务器端。其次,如果我的查询参数也包含这两个名称,那么它们将被覆盖。
我查看了路由器代码并找到了它们添加到我的参数中的位置(在dequeueRoute中),但是没有办法阻止添加,也没有办法在没有它的情况下获取我的查询参数。
有没有人知道如何在没有routeinfo和路由器的情况下获取查询参数?出于好奇,为什么他们首先被添加而不是单独的论点?
答案 0 :(得分:10)
你的权利。我继续测试你的说法,似乎所有的查询字符串参数都写入了上下文参数。
所以如果你有这样的路线:
http://www.somesite.com/#/services/?routeInfo=value1&router=value2¶m1=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¶m1=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
对象中,它将包含?
分隔符之后的所有内容。
这会回答你的问题吗?