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 控制器中的默认路由?的主要内容,如果未能解决你的问题,请参考以下文章

Backbone.js 路由而不更改 url

require.js+backbone 使用r.js 在本地与生产环境 一键压缩的实现方式

Backbone.js 状态管理/基于 url 片段的视图初始化

Backbone.js:未达到路由器回调

Backbone.js URL 路由

使用 Jasmine 监视 Backbone.js 路由调用