Подтвердить что ты не робот

Маршруты по умолчанию в контроллере 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('#',''))

Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Попробуйте добавить этот дополнительный маршрут в качестве последнего маршрута в вашем контроллере:

'*path':  'defaultRoute'

а затем обработайте его следующим образом:

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

Предполагается, что маршрут списка является предпочтительным по умолчанию. Это должно работать, поскольку Backbone.js будет соответствовать маршрутам по порядку, но всегда будет соответствовать маршруту "splat".

Ответ 2

Вы можете использовать формат маршрута splat для определения маршрута catch-all, например:

routes:
  'list' : 'showListView'
  '*path': 'defaultRoute'

defaultRoute: ->
  ...

Эти значки могут соответствовать любому количеству компонентов URL. Поскольку приведенный здесь, по существу, соответствует чему-либо, порядок, в котором определены маршруты, имеет значение. Предыдущие правила, перечисленные в литерале routes, имеют приоритет над более поздними. Поэтому правило catch-all должно быть указано последним.

Замечание: механика оператора for in оставляет порядок итераций ключей в объектах неопределенным (ECMA-262 раздел 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);
}

В этом случае маршруты, определенные позже, переопределяют ранее определенные маршруты, поэтому порядок от предыдущего отменяется для сохранения того же поведения.