Нужна помощь в выяснении того, что это делает Ember unloadAll

57
7

У меня есть этот маршрут, который в настоящее время, когда я возвращаюсь к нему, дает мне эту большую большую ошибку с трассировкой стека, которая не помогает мне понять, что происходит не так.

Ошибка при обработке маршрута: project.details Assertion Failed: вызов set на уничтоженном объекте Ошибка: Assertion Failed: вызов set на уничтоженном объекте при новой ошибке (native) в Error.EmberError(http://starqa.fmr.com/assets/vendor.js: 22615: 21) в Object.Ember.default.assert(http://starqa.fmr.com/assets/vendor.js:15716:13) в Object.set(http://starqa.fmr.com/assets/vendor.js:26367:22) at export.default.mixin.Mixin.create.set (http://starqa.fmr.com/assets/vendor.js:41034:20) в Ember.Object.extend.flushCanonical(http://starqa.fmr.com/assets/vendor.js:69769:14) в ember $ data $ lib $ system $ отношения $ state $ has_many $$ ManyRelationship.flushCanonical(http://starqa.fmr.com/assets/vendor.js: 71525: 22) в Queue.invoke(http://starqa.fmr.com/assets/vendor.js:11425:18) в Object.Queue.flush(http://starqa.fmr.com/assets/vendor.js: 11490: 13) в Object.DeferredActionQue

Через только пройдя через мои маршруты и комментирование вещи, я нашел это в моем маршруте проектов:

export default Ember.Route.extend(AuthenticatedRouteMixin, {
model: function(params) {
if (params.q) {
return this.store.find('project', params);
} else {
var _this = this;
Ember.run(function() {
_this.store.unloadAll('project');
});
return this.store.findAll('project', {reload: true});
}
}

И если я прокомментирую строки 7-9:

/*
Ember.run(function() {
_this.store.unloadAll('project');
});
*/

то ошибка уходит и переход работает. Этот бит кода был написан кем-то другим, и я думаю, что это связано с обновлением модели из хранилища, но я не могу понять, почему это приведет к ошибке "вызов набора на уничтоженный объект".

Любая помощь будет принята с благодарностью.

спросил(а) 2015-10-15T20:07:00+03:00 4 года, 11 месяцев назад
1
Решение
57

Оффлайн выглядит так: этот маршрут служит как для одного параметра проекта (q указан), так и для всех проектов, которые звучат как далеко не идеальный дизайн для ember. В идеале у вас должно быть два маршрута - проекты и маршрут проекта. Это на стороне архитектуры Ember.

На функциональной стороне это происходит, когда объект был выпущен ember, но вы пытаетесь получить к нему второй раз. Я подозреваю, что это происходит как Ember.run, запускает разгрузку в другом цикле, тогда как я не думаю, что это необходимо. Попробуйте удалить все выгруженные из цикла ember или, скорее всего, вы можете просто запустить его без него (как вы хотите удалить весь объект в текущем кеше каждый раз, когда вы вызываете маршрут?

this.store.unloadAll('project');
return this.store.findAll('project', {reload: true});

Или просто оставьте его прокомментированным (я думаю, оставляя его комментарий, должен работать для вас).

ответил(а) 2015-10-15T20:40:00+03:00 4 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема