У меня возникла проблема с навигацией/маршрутизацией URL-адреса. Скажем, например, я в настоящее время нахожусь в #contact/new
и снова запрашиваю тот же URL-адрес, тогда он не вызывает соответствующую функцию. Мне нужно изменить URL-адрес, например, на #contact/edit
, а затем нажать #contact/new
. Маршрутизация URL-адреса с одного и того же URL-адреса теперь является проблемой?
Backbone.js не будет перенаправляться на тот же URL, что и текущий.
Ответы (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-адресом, который передается в функцию навигации, и, таким образом, маршрут будет выполняться, если они не совпадают.
У меня такая же проблема. Маршрутизация одного и того же URL-адреса example.com/#/new (вызов одного и того же URL-адреса дважды) не приведет к запуску маршрута. Я создал обходной путь, изменив URL-адрес после каждой маршрутизации:
var url = window.location.href;
url = url.substring(0,url.indexOf('#')) + '#/';
window.location.replace(url);
или проще:
window.location.hash = '#/';
Но это решение кажется мне немного грязным.
Я тоже пытался разобраться с этой проблемой. Моя последняя попытка состояла в том, чтобы добавить функцию, которая добавляет поле метки времени к ссылке, а затем вызывает функцию навигации:
var AppRouter = Backbone.Router.extend({...});
var app_router = new AppRouter;
function LoadLink(Link) {
var Timestamp = new Date().getTime();
app_router.navigate("#/" + Link + "/ts_" + Timestamp);
}
Этот метод позволяет мне иметь ссылку, по которой можно щелкнуть несколько раз, однако теперь я должен учитывать метку времени при настройке маршрутов. Это может вернуться, чтобы укусить меня позже. :(
Я знаю, что опаздываю на вечеринку, но я решил аналогичную проблему с помощью функции навигации.
Попробуйте что-то вроде:
this.navigate("#contact/edit", {trigger: false, replace: true});
Который изменяет URL-адрес, который, по мнению маршрутизатора, находится на #contact/edit без фактического вызова действия.