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

时间:2011-05-22 12:58:57

标签: controller 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('#',''))

有更好的方法吗?

2 个答案:

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

在这种情况下,稍后定义的路由会覆盖先前定义的路由,因此前面的顺序会反转以保留相同的行为。