Ember.js: TransitionAborted при выполнении полного перехода по маршруту с измененными параметрами запроса

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

Почему возникает ошибка TransitionAborted при выполнении полного перехода по маршруту при изменении параметров запроса?

Я работаю над примером «Подключайтесь к полному переходу через refresh ()», приведенному в конце руководства Ember для параметров запроса (http://emberjs.com/guides/routing/query-params/).

Единственное изменение, которое я сделал, - это регистрировать ошибки:

Ember.RSVP.configure('onerror', function(error) {
  Ember.Logger.assert(false, error);
});

Вот обновленный JS Bin: http://jsbin.com/kinajoginedo/1/edit?console , output

Если вы нажмете кнопку «Изменить», в консоли появится сообщение об ошибке TransitionAborted.

Я уже некоторое время пытаюсь обновить Ember в своем приложении с 1.7.0-beta.1 + canary, но многие из моих тестов QUnit терпят неудачу, когда я запускаю их все вместе. Большинство моих тестов проходят нормально, если я запускаю их изолированно. Я подозреваю, что ошибки TransitionAborted могут вызывать сбои теста. Однако я не уверен, что исключения TransitionAborted являются нормальным явлением при выполнении полных переходов. Если кто-нибудь сможет подтвердить так или иначе, это будет очень полезно для выяснения первопричины моих проблем, какими бы они ни были.

Bug Query Params

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

К вашему сведению - все еще вижу это в 2.8.1 , я работал над этим, отклоняя вызовы обновления - вот Mixin, который вы можете добавить к маршрутам, которые используют refreshModel: true :

import Ember from 'ember';

/**
 * Debounce Refresh
 * Ember routes with queryParams that have refreshModel double-trigger a refresh:
 * see: https://github.com/emberjs/ember.js/issues/5566
 *
 * Mix this in to routes that define queryParams[param].refreshModel to avoid the TransitionAborted error thrown when double-triggering refreshes.
 */
export default Ember.Mixin.create({
  refreshDebounceThreshold: 100,
  _lastRefresh: null,
  _doRefresh() {
    if (this._lastRefresh) {
      this._lastRefresh();
      this._lastRefresh = null;
    }
  },
  refresh() {
    this._lastRefresh = this._super.bind(this, ...arguments);
    Ember.run.debounce(this, '_doRefresh', this.get('refreshDebounceThreshold'));
  }
});

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

@machty мысли?

У меня тоже такая проблема ...

Привет, ребята, есть новости по этому поводу? Что еще мы можем предоставить?

то же самое здесь - я получаю эту ошибку

Я тоже вижу эту ошибку. Стоит отметить, что метод RSVP configure устарел , однако результат тот же, что и при использовании RSVP.on .

Ember.RSVP.on('error', function(error) {
  Ember.Logger.assert(false, error);
});

Эта ошибка существенно влияет на приложения ваших парней или только на ваши тесты?

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

Я также вижу, что эта ошибка TransitionAborted сообщается некоторым пользователям через нашу службу отслеживания ошибок после добавления

Ember.RSVP.on('error', function(error) {
  Ember.Logger.assert(false, error);
});

Кажется, это срабатывает маршрут, модель которого обновляется каждые 2 секунды.

Я провел небольшое расследование, и похоже, что второй вызов fireQueryParamsDidChange в getTransitionByIntent ( transitionByIntent в моей копии Ember.js 1.7.1) в библиотеке router.js вызывает ошибку TransitionAborted (первый вызов выполняется в вызове queryParamsTransition ранее в функции):

https://github.com/tildeio/router.js/blob/03810a915789549c4798c8eeb7d23e64b9789c75/lib/router/router.js#L64

Когда я закомментировал эту строку, мое приложение, похоже, работает нормально и без ошибок. Мне это показалось ошибкой, поскольку transitionByIntent дважды уведомляет об изменении параметров запроса. Однако второй вызов был реализован @raytiley по определенной причине:

https://github.com/tildeio/router.js/commit/9a07446e62850e5aad241eb2c23d88127e4839d9

Я не совсем уверен, что понимаю причину, но дублирует ли это поведение установки refreshModel в значение true?

Сбой моих тестов QUnit был связан с чем-то совершенно другим (установил для параметра запроса значение null в обратном вызове отключения маршрута, что привело к сбою следующего теста при попытке перехода из-за изменения параметра запроса).

Испытал это на Ember 1.8.1.

редактировать

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

В моем случае мне нужно изменить несколько параметров запроса. Я все еще получаю ошибки консоли даже после того, как закомментировал строку, как это было предложено
JSBin: http://jsbin.com/kekowabazi/1/edit
Версия Ember: 1.8.1

@shripathee , я тоже столкнулся с вашей проблемой. Оказывается, обратный вызов fireQueryParamsDidChange вызывается один раз для каждого параметра запроса, который вы установили на refreshModel: true . Я не совсем уверен, когда вам нужно такое поведение (вместо единственного уведомления об изменении любого параметра запроса), поэтому я заменил хеш queryParams options на:

actions: {
  queryParamsDidChange: function() {
    this.refresh();
  }
}

@skoryky Да, это прекрасно работает. Спасибо.

Я тоже столкнулся с этой проблемой,

Также можно подтвердить это на 1.8.1 а также в ситуации, когда у меня есть несколько параметров запроса, например

queryParams:
    page:
      refreshModel: true
    query:
      refreshModel: true

Я вижу ту же ошибку.

У меня тоже такая проблема. (Ember 1.9.0) Только на refreshModel: true . refreshModel: false не вызывает ошибки. Хотя это не кажется фатальным.

Я тоже столкнулся с той же проблемой. Любые обновления?

Я включаю это в повестку дня нашей следующей встречи основной группы.

Я столкнулся с этой проблемой с Ember 1.11.0-beta.4. Обновления?

Столкнувшись с этой проблемой тоже. Меня это беспокоит только потому, что он регистрируется как ошибка - в остальном работает нормально (я делаю разбиение на страницы, страницы меняются, и все работает нормально).

РЕДАКТИРОВАТЬ: используя Ember 1.7.0

Видно это на 1.11.0-beta.1 + canary.26c1084c.

Я столкнулся с этой проблемой, и поскольку @gorandev только регистрируется, но не ставит под угрозу поток приложения.
Обходной путь может быть следующим:

      Ember.RSVP.on 'error', (error) ->
        if error && error.message == "TransitionAborted"
          return

Хм ...

Это поведение, которое я пытаюсь реализовать (что я не могу сделать в настоящий момент):

Пользователь может ввести (обычно) в поле поиска, которое обновляет модель маршрута. В настоящее время, если я проглатываю ошибки TransitionAborted, пользовательский интерфейс ввода не отвечает должным образом и заменяет текстовое поле завершенным переходом. Я бы предпочел отклонять запросы, которые накапливаются, а не ждать их разрешения.

export default Ember.Route.extend({
  queryParams: {
    q: { replace: true, refreshModel: true },
    sort: { replace: true, refreshModel: true },
    filter: { replace: true, refreshModel: true }
  },

  model: function(params) {
     return this.store.find('user', params);
  }
}

Видя это 1.11.1. Приложение отлично работает, кроме регистрации этой ошибки.

Я наблюдаю ту же проблему. Он составляет почти все мои производственные «сообщения об ошибках». (Я использую Track: js)

Я создал обновленный jsbin (Ember версии 1.11.1): http://jsbin.com/zewuda/1/edit?html , js, output

Мой единственный способ сейчас - взломать функцию onerror, чтобы не регистрировать ошибку, если это ошибка TransitionAborted.

У меня такая же проблема, но refresh() никогда не вызывается. Он просто прерывается.

То же самое и в 1.13.3, обходной путь @skoryky

Решение от @skoryky у меня не сработало. Мне пришлось обернуть refresh () в Ember.run.once, чтобы снова избежать ошибки TransitionAborted.

//in your router code

actions: {
  queryParamsDidChange: function() {
    Ember.run.once(this, this.refresh);
  }
}

Обходной путь

Ember v1.10.0

Решение @piotrze почти сработало для меня. пришлось вместо этого использовать next :

//in your router code

actions: {
  queryParamsDidChange: function() {
    Ember.run.next(this, 'refresh');
  }
}

Похоже, решение @piotrze Ember.run.once работало у меня на Ember 1.13, но больше не работает на 2.2

@richmolj обходной путь

Пожалуйста, откройте эту проблему повторно. Это все еще происходит в Ember 2.6, когда queryParams имеет refreshModel: true

Эмбер 2.7

queryParamsDidChange запускается несколько раз, даже если ничего не изменилось, поэтому я дополнительно сравниваю старые и новые значения queryParams.

    queryParamsDidChange: function(a,b) {
      // Compare to prevent refresh if nothing has changed
      if(
        a.page === b.page &&
        a.selectionId === b.selectionId &&
        a.sort === b.sort &&
        a.sortDirection === b.sortDirection
      ){
        return;
      }

      Ember.run.next(this, 'refresh');
    }

К вашему сведению - все еще вижу это в 2.8.1 , я работал над этим, отклоняя вызовы обновления - вот Mixin, который вы можете добавить к маршрутам, которые используют refreshModel: true :

import Ember from 'ember';

/**
 * Debounce Refresh
 * Ember routes with queryParams that have refreshModel double-trigger a refresh:
 * see: https://github.com/emberjs/ember.js/issues/5566
 *
 * Mix this in to routes that define queryParams[param].refreshModel to avoid the TransitionAborted error thrown when double-triggering refreshes.
 */
export default Ember.Mixin.create({
  refreshDebounceThreshold: 100,
  _lastRefresh: null,
  _doRefresh() {
    if (this._lastRefresh) {
      this._lastRefresh();
      this._lastRefresh = null;
    }
  },
  refresh() {
    this._lastRefresh = this._super.bind(this, ...arguments);
    Ember.run.debounce(this, '_doRefresh', this.get('refreshDebounceThreshold'));
  }
});

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

@supersabillon а, при возобновлении с "липкими" QP? Я отключил их в приложении, которое использую, интересно, почему я не столкнулся с этим случаем.

все еще происходит в 2.11.0-beta.2.

Да, это все еще происходит со мной в 2.10.0 :(

Было ли это тихо исправлено в 2.12.0? (совершить https://github.com/emberjs/ember.js/commit/cee49a315b2467f7c1a9193546a51e427dc72bd6)

@aaxelb не намеренно, но, возможно,

Я воспроизвел JSBin (с текущими версиями Ember), и он действительно кажется исправленным.

https://jsbin.com/cajiji/edit?html , js, вывод

закрытие ....

Эта ошибка также возникает при выполнении этого в маршруте:

return this.transitionTo(my_route)

Удалив ключевое слово return, исправьте.

Это происходило со мной только во время теста, особенно после обновления тестов до нового (иш) RFC. Как сказал @ cesarluis13915 , удаление return перед transitionTo исправило мой тест.

Произошло в нашем проекте при обновлении Ember 3.11.1.
return this.replaceWith(null, id); приводит к сбою теста с TransitionAborted
this.replaceWith(null, id); успешно: man_shrugging:

Я вижу это в службе отслеживания ошибок, Sentry

@rwjblue пинг

Наткнулся на это в 3.11.1. Вновь открыт в № 18416 с репродукцией. Смог обойти с помощью решения queryParamsDidChange сейчас не является действием, это просто метод.

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