Backbone中的默认路由使用routes属性

时间:2014-09-22 06:42:37

标签: javascript backbone.js backbone-routing

我正在使用Backbone项目,在我们的路由器中,我们在routes属性的末尾指定了一个默认路由:

routes: {
    "things": "stuff",
    "*actions": "default"
}

通过一些搜索,我看到了几个地方,例如this StackOverflow answerBackbone tutorial,建议以这种方式添加默认路线。

然而,这让我非常担心,因为从我在Backbone source中看到的内容,routes属性被简单地迭代以添加其中的所有路由,并据我所知,JavaScript中的对象迭代不保证任何排序。因此,使用上面的routes定义,不能保证默认路由的优先级最低,只是因为它位于定义的末尾。

这里的行为本质上是不明确的,事情实际上只是纯粹的运气,或者是否有其他事情确实让这件事变得安全?

1 个答案:

答案 0 :(得分:1)

如您所知,从route属性派生的路线没有保证订单......虽然在实践中许多浏览器会按照定义的顺序迭代它们,您也可以使用路线方法保证订单代替。

但是你联系的那两个例子怎么样?好吧,如果你仔细看看它们,你会发现它们没有像你那样处于同一级别的任何其他路线。 splat语法的存在只是为了提供更可读的方式来编写“任何不是问号的东西”(即([^?]*?));它实际上并不是一个默认的处理程序。

所以,如果你想要实现的目标是:

if (url == 'things') {
    doStuff();
} else {
    doActions();
}
你有两个选择。如果您愿意更改网址结构,只需:

/things
/actions/*actions

如果不是,您只需要定义区分的路线:

routes: {':rootLevelPath': rootLevelPathRoute},
rootLevelPathRoute: function(rootLevelPath) {
    if (rootLevelPath == 'things') {
        doThings();
    } else {
        doActions();
    }
}