自定义Backbonejs路由参数

时间:2014-12-25 04:07:04

标签: javascript backbone.js

考虑以下网址:

  

domains.google.com/registrar#t=b

注意:

  

#吨= B

在此示例中,变量“t”将当前标签存储在“b”用于记帐的页面上。


如何在骨干网中实现类似查询的查询?

我知道Backbone有支持url中参数的路由,但这仅限于数据在层次结构中时,例如:item /:id

但是那些在结构目录中不能很好地运行的应用程序设置呢?

我能想到的唯一解决方案是自定义解析器并自行分解键/值。

有什么想法吗?

1 个答案:

答案 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.testFnword作为参数调用。当然,您的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。因此,遗憾的是,您必须了解路由应采用的最大参数数量,并将其手动编码为您的正则表达式模式,就像我们上面所做的那样。