2014-09-22 158 views
3

我与一个骨干项目的工作,并在我们的路由器,我们在routes属性的末尾指定默认路由:缺省路由的路由属性

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

从有点绕搜索的,我见过几个地方,例如this StackOverflow answerBackbone tutorial,这表明以这种方式添加默认路线。

然而,此深表关注我,因为我可以在Backbone source看到,routes属性是简单地遍历加在它所有的路线,并以我所知,在JavaScript对象迭代没有按”不保证任何订购。因此,在定义上述routes时,并不能保证默认路由的优先级最低,只是因为处于定义的最后。

这里的行为基本上是不确定的,事实上只是纯粹运气的问题,或者是否还有其他事情要做,这实际上使得这是一件安全的事情?从route财产所衍生

回答

1

当你确定,路线有没有保证的顺序......虽然在实践中,许多浏览器都会在定义的顺序遍历它们,你也可以通过使用route方法,而不是保证顺序。

但是你链接的那两个例子呢?那么,如果你仔细观察他们,你会注意到他们没有像你那样在同一层次上有任何其他路线。 splat语法的存在仅仅是为了提供更具可读性的“任何不是问号”(即([^?]*?));它实际上不是一个默认的处理程序。

所以,如果你想达到什么是:

if (url == 'things') { 
    doStuff(); 
} else { 
    doActions(); 
} 

你有两个选择。如果你愿意改变你的URL结构,你可以简单地有:

/things 
/actions/*actions 

如果你没有,你只需要定义区分的路线:

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