2013-03-25 123 views
6

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

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

我已经查看了路由器代码,发现它们被添加到我的参数(在dequeueRoute中),但找不到防止添加的方法,也没有办法只在没有它们的情况下获取我的查询参数。

有谁知道我怎么能得到没有routeinfo和路由器的查询参数?出于好奇,他们为什么首先加入而不是单独的争论?

回答

8

您的权利。我继续前进,测试了你的说法,看起来所有查询字符串参数都被写入上下文参数。

,所以如果你有这样的路线:您激活方法内部

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'] 
} 

所以,查询字符串参数正在写入t他context对象,但如果您的查询字符串参数为routeInforoutersplat那么会发生不好的事情。特别是如果它的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对象它将包含?删除器后的所有内容。

这是否回答您的问题?

+0

除非我做了其他的错误,看来我只有在我使用mapAuto的时候才会得到splat属性。我想我可以使用它,但不知道还有什么会做我的路由。无论如何,从我玩得更远,对我来说最好的办法是简单地使用window.location.search。我真的希望有一种方法可以做到这一点,而不必自己解析字符串。 – 2013-03-26 20:33:42

+0

durandal处于早期阶段,路由器模块是插件。给它一些时间..我敢打赌,未来几个月会好得多。图书馆仍在积极努力。现在使用它很好,因为随着它的增长,你会变得更加知识渊博。 – 2013-03-26 23:06:18