我想为backbone.js控制器设置默认路由。目前我这样做:
class DealSearchController extends Backbone.Controller
routes:
'list' : 'showListView'
'photos' : 'showPhotoView'
'map' : 'showMapView'
initialize: ->
....
window.location.hash = 'list' if ! _.include( _.keys(@routes),(window.location.hash || '').replace('#',''))
有更好的方法吗?
答案 0 :(得分:85)
尝试将此附加路线添加为控制器中的最后一条路线:
'*path': 'defaultRoute'
然后像这样处理它:
defaultRoute: function(path) {
this.showListView();
}
这假定列表路由是您的首选默认值。这应该有效,因为Backbone.js将按顺序匹配路线,但总是匹配'splat'路线。
答案 1 :(得分:2)
您可以使用 splat 路由格式来定义全能路线,例如:
routes:
'list' : 'showListView'
'*path': 'defaultRoute'
defaultRoute: ->
...
这些splats可以匹配任意数量的URL组件。由于此处给出的基本匹配任何内容,因此定义路由的顺序很重要。 routes
字面值中列出的早期规则优先于后面的规则。 因此,catch-all规则应列在最后。
警告提示:for in
语句的机制将键的迭代顺序保留在未指定的对象中(ECMA-262 section 12.6.4):
未指定枚举属性的机制和顺序。
大多数浏览器(如果不是全部都有一些错误的例外)将按照定义的顺序进行迭代。如果定义的路由具有歧义,其正确的分辨率依赖于排序(如本例所示),和/或如果由于不可预测的环境而显式排序可能更可取,则还可以在Router
中动态定义路由的初始化程序,而不是声明性/静态地:
initialize: function () {
//router.route(route, name, [callback]);
this.route('*path', 'default', this.defaultRoute);
this.route('map', 'map', this.showMapView);
this.route('photos', 'photos', this.showPhotoView);
this.route('list', 'list', this.showListView);
}
在这种情况下,稍后定义的路由会覆盖先前定义的路由,因此前面的顺序会反转以保留相同的行为。