Перемещаться по маршруту с помощью кнопки
Будет ли Backbone.Router.navigate
установить test
в true
:
var test = false;
var Router = Backbone.Router.extend({
routes: {
'posts': 'showPosts'
},
showPosts: function () {
test = true;
}
});
router = new Router();
Backbone.history.start();
router.navigate('posts?foo=3', {trigger: true});
assert.ok(test);
Например, фрагмент posts?foo=3
по умолчанию будет соответствовать трассе posts
, или мне нужно установить для него еще один маршрут, например: posts?*querystring
?
Спасибо
PS: Я знаю, что существует backbone-query-parameters, но я хочу знать только для магистрали.
Ответы
Ответ 1
Вам нужно добавить еще один маршрут с ожидающим параметром:
routes: {
'posts?foo=:foo' : 'showPosts',
'posts': 'showPosts'
},
showPosts: function (foo) {
if(typeof foo != 'undefined'){
// foo parameters was passed
}
test = true;
}
Обновление
Вы можете определить общий маршрут, чтобы вернуть всю строку запроса, а затем проанализировать его в обработчике:
routes: {
'posts': 'showPosts',
'posts?*queryString' : 'showPosts'
},
showPosts: function (queryString) {
var params = parseQueryString(queryString);
if(params.foo){
// foo parameters was passed
}
}
...
// and the function that parses the query string can be something like :
function parseQueryString(queryString){
var params = {};
if(queryString){
_.each(
_.map(decodeURI(queryString).split(/&/g),function(el,i){
var aux = el.split('='), o = {};
if(aux.length >= 1){
var val = undefined;
if(aux.length == 2)
val = aux[1];
o[aux[0]] = val;
}
return o;
}),
function(o){
_.extend(params,o);
}
);
}
return params;
}
обновление 2
Здесь живая демонстрация, чтобы увидеть код в действии.
Ответ 2
Только в дополнение к предыдущим ответам вместо определения двух маршрутов, имеющих один и тот же обратный вызов, например:
routes: {
'posts': 'showPosts',
'posts?*querystring': 'showPosts'
}
У вас может быть только один маршрут, чтобы очистить код:
routes: {
'posts(?*querystring)': 'showPosts'
}
Ответ 3
Backbone docs:
Маршруты могут содержать части параметров,: param, которые соответствуют одному URL-компоненту между слэшами; и splat parts * splat, который может соответствовать любому количеству компонентов URL.
Если вы все еще хотите сохранить функциональность без соответствия, вы можете определить два маршрута
routes: {
'posts': 'showPosts',
'posts?*querystring': 'showPosts'
}
showPosts: function(querystring) {
if (querystring) {
// here you can parse your querystring, for your case the querystring variable is
// 'foo=3'
}
//here you'll show posts according to the querystring (or lack thereof)
}
Ответ 4
Здесь еще один, все еще использующий lodash (подчеркивание). Удалено _.map, добавлено немного многословия к переменным и удалено из стартового '?' если присутствует:
function parseQueryString(queryString)
{
if (!_.isString(queryString))
return
queryString = queryString.substring( queryString.indexOf('?') + 1 )
var params = {}
var queryParts = decodeURI(queryString).split(/&/g)
_.each(queryParts, function(val)
{
var parts = val.split('=')
if (parts.length >= 1)
{
var val = undefined
if (parts.length == 2)
val = parts[1]
params[parts[0]] = val
}
})
return params
}
Ответ 5
RFC 3986 "синтаксис для URI" указывает, что параметры запроса сдвигаются до хэш-фрагмента.
В URI хэш-метка # вводит необязательный фрагмент в конце URL-адреса. Общий синтаксис RFC 3986 для URI также позволяет ввести необязательную часть запроса с помощью вопросительного знака?. В URI с запросом и фрагментом фрагмент следует за запросом.
У меня есть эта проблема с обработкой перенаправления, которую я получаю с сервера, т.е. " http://foo.com/main.html?error=errormessage#site". Я хотел бы маршрутизировать запрос, но не вижу способа написать выражение маршрута магистрали для обработки этого URL-адреса. Пока я просто маршрутизирую хэш и проверяю запрос, анализируя location.search.