Дополнительный параметр маршрута backbone.js

Возможно ли иметь дополнительные параметры в маршруте Backbone.js?

например:

routes:
  "search/[:query]": "searchIndex"

вместо:

routes:
  "search/": "searchIndex"
  "search/:query": "searchIndex"

Ответ 1

В соответствии с базой 0.9.9 вы можете добавить необязательные параметры с круглыми скобками.

Например, в объекте маршрутов вы можете определить необязательную часть маршрута, например:

routes: {
    "organize(/:action)": "displayOrganize"
}

Теперь путь URL будет соответствовать /#organize и маршрутам, как /#organize/create.

Имейте в виду, что если вам нужны маршруты, такие как /#organize/ (с завершающей косой чертой), вы можете сделать:

routes: {
    "organize(/)(:action)": "displayOrganize"
}

Ответ 2

Вероятно, самый простой способ - объявить более одного маршрута, один с дополнительным аргументом, без него:

routes:{
        "authProxy/:hash": "authProxy",                                                                                                                                                                 
        "authProxy/:hash/:url": "authProxy"
}

то просто проверьте их в своем методе:

authProxy: function(hash, url){
    if (url){
      // Hash and URL.
    }else{
      // Just hash.
    }
}

Обратите внимание, что мне это нравится намного лучше, чем два других ответа, потому что другим разработчикам очень легко понять, что происходит.

Ответ 3

Вы можете вручную добавлять маршруты, основанные на регулярном выражении, с помощью метода route:

маршрут router.route(route, name, [callback])

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

Итак, что-то вроде этого должно работать:

this.route(/^search\/(.*)?/, 'searchIndex');

Тогда searchIndex будет вызываться с вашим ничем или вашим :query в качестве аргумента.

Недостатком является то, что вы не можете вводить маршруты регулярных выражений в ваш объект routes. Вы можете добавить все свои маршруты с помощью route внутри вашего маршрутизатора initialize, если хотите сохранить их все вместе.

Ответ 4

Как насчет использования *splat:

маршруты router.routes

Маршруты хеш отображают URL-адреса с параметрами для функций на вашем маршрутизаторе, аналогично хешам Просмотр событий. Маршруты могут содержать части параметров, :param, которые соответствуют одному URL-компоненту между слэшами; и splat *splat, которые могут соответствовать любому количеству компонентов URL.

Например, маршрут "search/:query/p:page" будет соответствовать фрагменту #search/obama/p2, передав "obama" и "2" в действие. Маршрут "file/*path" будет соответствовать #file/nested/folder/file.txt, передав "nested/folder/file.txt" в действие.