Backbone.js控制器中的默认路由?

我想为我的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('#','')) 

有没有更好的方法呢?

尝试添加这个额外的路线作为您的控制器的最后一个路线:

 '*path': 'defaultRoute' 

然后像这样处理它:

 defaultRoute: function(path) { this.showListView(); } 

这假定列表路由是您的首选默认值。 这应该工作,因为Backbone.js将按顺序匹配路线,但将始终匹配“splat”路线。

您可以使用splatpath格式来定义一个全部路由,例如:

 routes: 'list' : 'showListView' '*path': 'defaultRoute' defaultRoute: -> ... 

这些splats可以匹配任意数量的URL组件。 由于这里给出的基本上匹配任何东西,路由的定义顺序很重要。 在routes字面上列出的早期规则优先于后面的规则。 所以这个全面的规则应该列在最后。

警告的提示for in语句的机制在未指定的对象中保留键的迭代顺序( ECMA-262第12.6.4节 ):

没有指定枚举属性的机制和顺序。

大多数浏览器(如果不是全部都有一些错误的例外)将按照定义的顺序进行迭代。 如果定义的路由具有正确parsing依赖于sorting(如本例中那样)的歧义性,并且/或者由于不可预知的环境而导致显式sorting可能是优选的,则也可以在Router的初始化器中dynamic定义路由,而不是声明性的/静态的:

 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); } 

在这种情况下,后面定义的路由会覆盖以前定义的路由,所以从前面的顺序是相反的,以保持相同的行为。