Backbone.js не будет перенаправляться на тот же URL, что и текущий.

У меня возникла проблема с навигацией/маршрутизацией URL-адреса. Скажем, например, я в настоящее время нахожусь в #contact/new и снова запрашиваю тот же URL-адрес, тогда он не вызывает соответствующую функцию. Мне нужно изменить URL-адрес, например, на #contact/edit, а затем нажать #contact/new. Маршрутизация URL-адреса с одного и того же URL-адреса теперь является проблемой?


person Kishan    schedule 29.02.2012    source источник
comment
У меня нет такой проблемы. Не могли бы вы опубликовать пример кода?   -  person Sơn Trần-Nguyễn    schedule 01.03.2012
comment
Почему вам нужно направлять на один и тот же URL-адрес? Вы можете вызвать функцию, которую хотите снова вызвать, с помощью событий.   -  person teggy    schedule 02.03.2012
comment
ответ, который вы, вероятно, ищете: stackoverflow.com/a/10181053/126600   -  person zack    schedule 20.06.2013


Ответы (4)


В итоге я решил эту проблему, заранее вызвав тихий переход к корню:

var url = window.location.pathname.substr(Backbone.history.root.length);
this.navigate('/', { trigger: false });
this.navigate(url, { trigger: true });

Имейте в виду, что это создаст дополнительную запись в истории, но в моем случае это не важно.

Вы также можете заставить это работать без записи истории, изменив свойство fragment объекта Backbone.history, но это свойство должно быть частным, поэтому я бы дважды подумал, прежде чем возиться с ним :)

Свойство фрагмента — это то, что используется для сопоставления текущего URL-адреса с URL-адресом, который передается в функцию навигации, и, таким образом, маршрут будет выполняться, если они не совпадают.

person Jørgen    schedule 16.12.2013

У меня такая же проблема. Маршрутизация одного и того же URL-адреса example.com/#/new (вызов одного и того же URL-адреса дважды) не приведет к запуску маршрута. Я создал обходной путь, изменив URL-адрес после каждой маршрутизации:

var url = window.location.href;
url = url.substring(0,url.indexOf('#')) + '#/';
window.location.replace(url);

или проще:

window.location.hash = '#/';

Но это решение кажется мне немного грязным.

person kimomat    schedule 12.04.2012

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

var AppRouter = Backbone.Router.extend({...});

var app_router = new AppRouter;

function LoadLink(Link) {
  var Timestamp = new Date().getTime();
  app_router.navigate("#/" + Link + "/ts_" + Timestamp);
}

Этот метод позволяет мне иметь ссылку, по которой можно щелкнуть несколько раз, однако теперь я должен учитывать метку времени при настройке маршрутов. Это может вернуться, чтобы укусить меня позже. :(

person Drizzt_Guen    schedule 30.08.2012

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

Попробуйте что-то вроде:

this.navigate("#contact/edit", {trigger: false, replace: true});

Который изменяет URL-адрес, который, по мнению маршрутизатора, находится на #contact/edit без фактического вызова действия.

person Ted S    schedule 16.10.2012