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); }
在这种情况下,后面定义的路由会覆盖以前定义的路由,所以从前面的顺序是相反的,以保持相同的行为。