Почему возникает ошибка 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 являются нормальным явлением при выполнении полных переходов. Если кто-нибудь сможет подтвердить так или иначе, это будет очень полезно для выяснения первопричины моих проблем, какими бы они ни были.
@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
ранее в функции):
Когда я закомментировал эту строку, мое приложение, похоже, работает нормально и без ошибок. Мне это показалось ошибкой, поскольку 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:
https://github.com/emberjs/ember.js/issues/18177 это то же самое?
Я вижу это в службе отслеживания ошибок, Sentry
@rwjblue пинг
Наткнулся на это в 3.11.1. Вновь открыт в № 18416 с репродукцией. Смог обойти с помощью решения queryParamsDidChange
сейчас не является действием, это просто метод.
Самый полезный комментарий
К вашему сведению - все еще вижу это в
2.8.1
, я работал над этим, отклоняя вызовы обновления - вот Mixin, который вы можете добавить к маршрутам, которые используютrefreshModel: true
: