Backbone.js 控制器中的默认路由?
Posted
技术标签:
【中文标题】Backbone.js 控制器中的默认路由?【英文标题】:Default Routes in a Backbone.js controller? 【发布时间】:2011-05-22 12:58:57 【问题描述】:我想为我的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('#',''))
有没有更好的方法?
【问题讨论】:
请注意,如果您使用@route path, ->
设置路由器,那么订单很重要。更一般的路线应该放在第一位,例如默认路线应该放在第一位,否则它将始终被触发,从而掩盖您更具体的路线。这对我来说有点直观:)
【参考方案1】:
尝试将此附加路由添加为控制器中的最后一个路由:
'*path': 'defaultRoute'
然后这样处理:
defaultRoute: function(path)
this.showListView();
这假定列表路由是您的首选默认值。这应该可以工作,因为 Backbone.js 会按顺序匹配路由,但总是会匹配 'splat' 路由。
【讨论】:
这通常是一个很好的解决方案,只要迭代顺序与对象字面量中的声明顺序匹配即可。【参考方案2】:您可以使用 splat 路由格式来定义一个包罗万象的路由,例如:
routes:
'list' : 'showListView'
'*path': 'defaultRoute'
defaultRoute: ->
...
这些 splats 可以匹配任意数量的 URL 组件。因为这里给出的那个基本上匹配任何东西,所以定义路由的顺序很重要。 routes
文字中列出的早期规则优先于后面的规则。 所以包罗万象的规则应该放在最后。
警告说明:for in
语句的机制未指定对象中键的迭代顺序 (ECMA-262 section 12.6.4):
枚举属性的机制和顺序......没有指定。
大多数浏览器,如果不是所有浏览器都有一些错误的异常,将按照定义的顺序进行迭代。如果定义的路由有歧义,其正确解析依赖于排序(如本例中),和/或如果由于不可预测的环境可能更可取显式排序,也可以在Router
's 中动态定义路由初始化器,而不是声明式/静态:
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);
在这种情况下,稍后定义的路由会覆盖之前定义的路由,因此将之前定义的顺序颠倒以保持相同的行为。
【讨论】:
以上是关于Backbone.js 控制器中的默认路由?的主要内容,如果未能解决你的问题,请参考以下文章
require.js+backbone 使用r.js 在本地与生产环境 一键压缩的实现方式