Маршруты по умолчанию в контроллере 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('#',''))
Есть ли лучший способ сделать это?
Ответы
Ответ 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);
}
В этом случае маршруты, определенные позже, переопределяют ранее определенные маршруты, поэтому порядок от предыдущего отменяется для сохранения того же поведения.