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

Когда я нажимаю новый URL-адрес в Backbone.history, параметры запроса остаются?

Скажем, я использую pushstate Backbone, и я перехожу к странице с параметрами запроса:

domain.com/user/111?hello=123

Когда я выполняю это:

Backbone.history.navigate('/settings', true);

Моя страница настроек загружается отлично, но? hello = 123 остается в URL-адресе...

domain.com/settings?hello=123

И этот параметр запроса остается в URL-адресе везде, где я перемещаюсь по сайту...

4b9b3361

Ответ 1

Параметры маршрутизации магистрали и запроса - это несчастливый брак. Проблемы хорошо описаны в этой проблеме GitHub.

Основная проблема заключается в том, что Backbone.Router предназначен для работы с фрагментами хеша URL-адреса, а также с помощью pushState API. При использовании хеш-URL строка запроса предшествует хешу и никогда не сопоставляется в маршруте. С помощью pushState строка запроса является частью фрагмента URL-адреса и требует другого выражения маршрута.

Скажем, у вас будет маршрут search, и этот маршрут будет необязательно принимать параметры q, sort и type. В качестве строки запроса, которая будет выглядеть примерно так:

search?q=kittens&sort=asc&type=images

Проблема в том, что для пользователей более старых браузеров Backbone вернется к маршрутизации hashchange, и маршрут станет:

?q=kittens&sort=asc&type=images#search

Используемый вами плагин пытается обойти эту проблему, но не устраняет основную проблему.

Если возможно, вам следует рассмотреть возможность использования строк запроса и передать любую информацию о состоянии, используя необязательные фрагменты в выражениях маршрута. Предыдущие примеры маршрутов затем станут:

//pushState
search/q/kittens/sort/asc/type/images

//hash fragment
#search/q/kittens/sort/asc/type/images

Используя (optional) детали маршрута и :captures (docs), вы можете представить этот URL-адрес со следующим выражением:

var Router = Backbone.Router.extend({
  routes: {
    "search(/q/:query)(/sort/:sort)(/type/:type)": "search"
  },

  search: function(query, sort, type) {
    console.log(query, sort, type); //-> "kittens", "asc", "images" 
  }
});

Пока фрагменты маршрута находятся в указанном порядке, это будет соответствовать URL-адресам без каких-либо параметров и любых параметров, например:

search                       //->  undefined,  undefined, undefined
search/q/kittens/type/images //->  "kittens",  undefined, "images"
search/sort/asc/type/images  //->  undefined,  "asc",     "images"

Таким образом, вам не нужно беспокоиться о сторонних библиотеках строковых запросов или совместимости браузера. И если вы спросите меня, последний тип URL-адресов выглядит более чистым.

Ответ 2

Вам не нужно использовать плагин backbone-query-parameters, чтобы справиться с этим больше, просто убедитесь, что у вас установлена ​​последняя версия Backbone, а затем перезапишите метод loadUrl внутри History.prototype.

// Regex to match search query strings
var searchStripper = /\?.*$/g;

// Attempt to load the current URL fragment. If a route succeeds with a
// match, returns `true`. If no defined routes matches the fragment,
// returns `false`.
loadUrl: function(fragmentOverride) {
  var fragment = this.fragment = this.getFragment(fragmentOverride);
  fragment = fragment.replace(searchStripper, ''); // remove the search query parameter
  var matched = _.any(this.handlers, function(handler) {
    if (handler.route.test(fragment)) {
      handler.callback(fragment);
      return true;
    }
  });
  return matched;
},

Ответ 3

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

Я действительно вдохновлен вашим сообщением. На раннем этапе моего текущего проекта я ввел параметры базового запроса, он работал хорошо. Но позже, позвоночник внес некоторые изменения, поэтому параметры базового запроса не могут больше захватывать параметры. До недавнего времени я обнаружил, что автор обновил параметры базового запроса. Я снова втянул его, и он сработал.

Тогда, вы знаете. Я смотрю на ту же проблему и чувствую себя очень расстроенным. Я никогда не сомневался в параметрах базового запроса, пока я не увидел ваш пост.

Я удалил плагин и получил свой собственный код, теперь моя история работает как прелесть.

Существует множество способов получения параметров get. Мой только один из них, но он выполняет эту работу для меня. Просто для вашей справки я размещаю его здесь.

  getParams: ->
    rtn = {}

    if window.location.search.length > 0
      queryStringRegex =  /^\?(.*)/
      match = queryStringRegex.exec window.location.search
      param_string = match[1]

      if param_string.length > 0
        params_array = param_string.split("&")

        for value in params_array
          temp = value.split("=")
          rtn[temp[0]] = decodeURI(temp[1])

    rtn

На всякий случай, мои маршруты будут такими:

"path(?*queryString)" : "pathAction"