我正在使用Backbone项目,在我们的路由器中,我们在routes
属性的末尾指定了一个默认路由:
routes: {
"things": "stuff",
"*actions": "default"
}
通过一些搜索,我看到了几个地方,例如this StackOverflow answer和Backbone tutorial,建议以这种方式添加默认路线。
然而,这让我非常担心,因为从我在Backbone source中看到的内容,routes
属性被简单地迭代以添加其中的所有路由,并据我所知,JavaScript中的对象迭代不保证任何排序。因此,使用上面的routes
定义,不能保证默认路由的优先级最低,只是因为它位于定义的末尾。
这里的行为本质上是不明确的,事情实际上只是纯粹的运气,或者是否有其他事情确实让这件事变得安全?
答案 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();
}
}