考虑以下网址:
domains.google.com/registrar#t=b
注意:
#吨= B
在此示例中,变量“t”将当前标签存储在“b”用于记帐的页面上。
如何在骨干网中实现类似查询的查询?
我知道Backbone有支持url中参数的路由,但这仅限于数据在层次结构中时,例如:item /:id
但是那些在结构目录中不能很好地运行的应用程序设置呢?
我能想到的唯一解决方案是自定义解析器并自行分解键/值。
有什么想法吗?
答案 0 :(得分:2)
扩展@try-catch-finally
的评论,我将向您展示如何使用符合您条件的简单RegEx模式创建自己的路线。
这是我们将使用的正则表达式:
^\w+? # match one word (or at least a character) at the
# beginning of the route
[=] # until we parse a single 'equals' sign
( # then start saving the match inside the parenthesis
[a-zA-Z0-9]* # which is any combination of letters and numbers
) # and stop saving
将正则表达式放在一起看起来像:/^\w+?[=]([a-zA-Z0-9]*)/
。
现在我们设置路由器,
var MyRouter = Backbone.Router.extend({
initialize: function(options) {
// Matches t=b, passing "b" to this.open
this.route(/^\w+?(?<=[=])(.*)/, "testFn");
},
routes: {
// Optional additional routes
},
testFn: function (id) {
console.log('id: ' + id );
}
});
var router = new MyRouter();
Backbone.history.start();
TL; DR 是MyRouter.initialize
中我们添加了一个采用上述正则表达式并调用MyRouter.testFn
函数的路由。对h ttp://yourdomain.com#word1=word2
的任何调用都会在括号后将MyRouter.testFn
与word
作为参数调用。当然,您的word
地点设置可以是您问题t=b
中的单个字符。
假设您想要提取多个参数,而不仅仅是一个参数。了解Backbone如何提取参数的关键是捕获组 ()
。捕获组允许您将括号内定义的匹配“保存”到正则表达式的本地变量中。 Backbone使用这些保存的匹配作为它应用于路由回调的参数。
因此,如果你想在路线中捕捉两个参数,你可以使用这个正则表达式:
^\w+?[=]([a-zA-Z0-9]*)[,]\w+?[=]([a-zA-Z0-9]*)
简单地说,期望在两个参数占位符之间使用逗号分隔符。它会匹配,
t=b,some=thing
您可以根据需要多次重复[,]\w+?[=]([a-zA-Z0-9]*)
模式。如果要概括模式,可以使用非捕获令牌(?: ... )
并执行类似的操作,
^\w+?[=]([a-zA-Z0-9]*)(?:[,]\w+?[=]([a-zA-Z0-9]*))?(?:[,]\w+?[=]([a-zA-Z0-9]*))?
上面的正则表达式将查找至少一个匹配项,并且可选择再进行两次匹配。通过在?
组的末尾放置(?: ... )
标记,我们说括号中的模式可以找到零次或一次(即它可能存在也可能不存在)。这允许您在知道最多可以预期3个参数时设置路线,但有时您可能只需要一个或两个。
您可能会问自己,为什么不简单地使用一个允许无限数量匹配的贪婪(?: ... )
组。像,
^\w+?[=]([a-zA-Z0-9]*)(?:[,]\w+?[=]([a-zA-Z0-9]*))*
使用此正则表达式模式,您必须提供一个参数,但您可以采用无限数量的后续匹配。不幸的是,虽然正则表达式工作正常,但你不会得到理想的结果。 (例如,参见this Question。)
这是JavaScript的限制。重复捕获组(即([a-zA-Z0-9]*)
捕获组将重复(?: ... )
非捕获组的每次重复)JavaScript只保存最后一个匹配项。因此,如果您通过t=b,z=d,g=f,w=1ee
之类的路线,则只会保存1ee
。因此,遗憾的是,您必须了解路由应采用的最大参数数量,并将其手动编码为您的正则表达式模式,就像我们上面所做的那样。