Backbone.Router принимает запрос и путь

Я хочу, чтобы мой экземпляр Backbone.Router прослушивал хеш-банг, такой как "#/settings" и "#/settings/privacy"

В настоящее время я решаю эту проблему следующим образом:

var Router = Backbone.Router.extend({

    routes: {
         "settings": "settings",
         "settings/:query": "settings"
    },

    settings: function(query) {
        // do the routing
    }

});

Теперь я хотел бы сделать все это только одним маршрутом. К сожалению, "settings/:query" разрешает только "settings /"

Любая идея, как справиться с этим?

С уважением

1 ответ

Решение

У вас есть несколько вариантов здесь. Если вы довольны такими маршрутами, как #settings/ (обратите внимание на последний слеш) и #settings/privacy тогда вы можете использовать это:

routes: {
    'settings/*query': 'settings'
}

Демо: http://jsfiddle.net/ambiguous/m7ufD/

Это не будет работать только с #settings тем не менее, последний слеш необходим для того, чтобы этот маршрут работал.

Если у вас нет таких маршрутов, как #settings-something-else тогда вы можете сделать это:

routes: {
    'settings*query': 'settings'
}

Демо: http://jsfiddle.net/ambiguous/MudaG/

Это также будет соответствовать таким вещам, как #settingsandstuff и это оставило бы косую черту в аргументе обработчика маршрута (то есть функция получит '/privacy' вместо просто 'privacy').

Самый гибкий вариант - это использовать route непосредственно с регулярным выражением, то вы можете сопоставить #settings а также #settings/privacy с одним маршрутом без любой из вышеперечисленных проблем:

// No routes, do it in initialize instead
initialize: function() {
    this.route(/^settings(?:\/(.*)|)$/, 'settings');
}

Демо: http://jsfiddle.net/ambiguous/XGrQz/

Это не будет соответствовать #settings-and-stuff и он не будет включать начальный слеш в аргумент функции для #settings/privacy,

Другие вопросы по тегам