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

Перемещаться по маршруту с помощью кнопки

Будет ли 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, но я хочу знать только для магистрали.

4b9b3361

Ответ 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.