Активное обновление URL-адресов - это хорошо, когда все удается прервать или выполнить переход в одном цикле выполнения. Но прерывания и переходы могут происходить в последующих циклах выполнения, и в этом случае мы оставляем приложение в неработающем состоянии.
В случае прерывания вы получите URL-адрес, который не отражает ваше реальное текущее состояние. В следующий раз, когда пользователь нажмет кнопку «Назад», ничего не произойдет.
В случае перенаправления вы нарушаете кнопку возврата, оставляя промежуточное состояние в истории пользователя, которое часто просто перенаправляет их обратно.
Я обсудил это с @machty, и мы решили, что было бы хорошо над этим поработать. Скорее всего, маршрутизатор может отслеживать нетерпеливые нажатия URL-адресов и откатывать их с помощью history.back()
или подобного, когда происходит прерывание.
Я согласен с этим вопросом. Я вижу это сейчас, даже если я сделаю transition.abort()
в хуке willTransition
маршрута. URL-адрес отражает страницу, на которую он перешел бы, если бы переход не был прерван.
: +1:
@ ef4 Я бы хотел, чтобы вы
Я могу поработать над этим, но, вероятно, не сразу.
: +1: столкнулся с этим, следуя примеру кода willTransition
в документации API. URL-адрес изменяется даже после вызова abort
.
У меня такая же проблема. Я создал jsbin, воссоздав его для любопытных: http://emberjs.jsbin.com/tijebi/1
@ ef4 все еще планируете посмотреть на это?
Извините, в последнее время это не входит в мой список приоритетов.
Для справки, я только что столкнулся с той же проблемой
Мы избавляемся от нетерпеливых URL-адресов, закрываясь в пользу if # 9919
На всякий случай, если у кого-то все еще есть эта проблема и требуется решение _ прямо сейчас_:
// app/routes/your-route.js
export default Ember.Route.extend({
// ...
actions: {
willTransition(transition) {
var model = this.controller.get('model');
if (
model.get('hasDirtyAttributes') &&
!confirm("You're going to discard all unsaved changes. Are you sure?")
) {
transition.abort();
// Custom revert of Back button result
var oldURL = this.router.generate(this.routeName, model);
var newURL = this.router.location.getURL();
if (oldURL != newURL) {
this.router.location.setURL(oldURL);
}
} else {
return true;
}
}
}
});
Я не люблю напрямую использовать методы this.router.location
но это единственный способ сделать это прямо сейчас (для обработки _все типы местоположений_)
Я только что обновил свой jsbin с прошлого года до версии 1.13.4, и эта проблема все еще существует: http://emberjs.jsbin.com/lohekasuhu/edit?html , css, js
Я могу подтвердить, что это все еще проблема с 1.13.11.
Вызов abort()
при переходе в afterModel
приводит к обновлению URL-адреса и переходу приложения в неработающее состояние.
Последующие вызовы transitionToRoute
не смогли правильно обновить маршрут, и вышеуказанный обходной путь больше не работает, поскольку router.location
не имеет методов getURL
и setURL
.
Я обновил @bcardarella «s [jsbin к 2.5.0]. Все еще происходит.
Это было исправлено https://github.com/tildeio/router.js/pull/197 (в 2.10.0-beta.3 +).
Демо против v2.10.0-beta.3: http://emberjs.jsbin.com/yeqisuh/1
@rwjblue Я еще не уверен, что это исправлено для случая прерывания. Я вижу эту проблему в ember 2.12.0. Когда я перехожу к маршруту, который прерывается в хуке модели, URL-адрес отражает состояние приложения, как если бы переход не был прерван. Другие по-прежнему сталкиваются с таким поведением transition#abort
?
@kanderek Да, я только что столкнулся с таким поведением. Хотя я на 2.11.3.
Привет,
с ember 2.14 проблема все еще сохраняется
Возникла эта проблема с 2.11.3
В настоящее время я использую этот уродливый обходной путь, который я нашел в stackoverflow
//right after an aborted transition
if (window.history) {
window.history.forward();
}
Пожалуйста, не стыдись меня за это ^
+1
Я все еще вижу эту проблему! Я на 2.12.2
Может ли кто-нибудь предоставить этому неудачный пример?
@wagenet вот пример использования Ember 3.1.1:
https://github.com/btecu/ember-issues/tree/5210
@SirZach @adamreisnz @bcardarella @bschouwerwou @btecu @cibernox @dkorenblyum @ EF4 @kanderek @kanongil @kottenator @machty @mutewinter @pixelhandler @ рафаэль-Паива @rwjblue @stefanpenner @wagenet @woprandi это еще вопрос, возможно , мы должны закрыть или создать новую репродукцию этого, как вы думаете?
@btecu не могли бы вы обновить свой пример до Ember 3.5?
+1 И вот сейчас сталкиваюсь с этим (думаю). В нашем случае мы переходим на страницу, а затем возвращаемся, используя window.history.go (-1) - кажется, просто продолжается загрузка текущей страницы (завершение перехода и т. Д. И загрузка остальной части асинхронного контента), что занимает некоторое время, а затем в конечном итоге делает переход обратно. Однако URL-адрес обновляется немедленно. Возможно, потому, что мы напрямую используем API истории?
Просто испытал это с 3.9.1
Эта проблема запутана, потому что исходная ошибка определенно была исправлена. Мы больше не занимаемся обновлением URL-адресов. Я собираюсь закрыть, потому что здесь много не относящейся к делу истории.
@miguelcobain , пожалуйста, поделитесь своим воспроизведением 3.9.1 в качестве нового выпуска, это поможет привлечь к нему должное внимание.
Это был лучший результат, когда я искал эту проблему, которая все еще кажется актуальной, поэтому я подумал, что вставлю обновленный фрагмент с обходным путем для всех, кто наткнется на это (пожалуйста, дайте мне знать, есть ли реальное решение, которое Я не в курсе):
<strong i="6">@service</strong> router
<strong i="7">@action</strong>
willTransition(transition) {
if (!transition.to.find(route => route.name === this.routeName) && !confirm('confirm?')) {
transition.abort()
let oldURL = this.router.currentURL;
let newURL = this.router.location.getURL();
if (oldURL != newURL) {
this.router.location.setURL(oldURL);
}
}
return true;
}
Это упрощенная версия предложения @kottenator, сделанного выше (https://github.com/emberjs/ember.js/issues/5210#issuecomment-122033542).
Самый полезный комментарий
Это было исправлено https://github.com/tildeio/router.js/pull/197 (в 2.10.0-beta.3 +).
Демо против v2.10.0-beta.3: http://emberjs.jsbin.com/yeqisuh/1