Ember.js: Очистить активные URL-адреса после прерывания

Созданный на 22 июл. 2014  ·  28Комментарии  ·  Источник: emberjs/ember.js

Активное обновление URL-адресов - это хорошо, когда все удается прервать или выполнить переход в одном цикле выполнения. Но прерывания и переходы могут происходить в последующих циклах выполнения, и в этом случае мы оставляем приложение в неработающем состоянии.

В случае прерывания вы получите URL-адрес, который не отражает ваше реальное текущее состояние. В следующий раз, когда пользователь нажмет кнопку «Назад», ничего не произойдет.

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

Я обсудил это с @machty, и мы решили, что было бы хорошо над этим поработать. Скорее всего, маршрутизатор может отслеживать нетерпеливые нажатия URL-адресов и откатывать их с помощью history.back() или подобного, когда происходит прерывание.

Bug Inactive Needs Submitter Response

Самый полезный комментарий

Это было исправлено https://github.com/tildeio/router.js/pull/197 (в 2.10.0-beta.3 +).

Демо против v2.10.0-beta.3: http://emberjs.jsbin.com/yeqisuh/1

Все 28 Комментарий

Я согласен с этим вопросом. Я вижу это сейчас, даже если я сделаю 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).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги