Обновление до Ember-Data 2.14 сломало вычисленный фильтр на hasMany - PullRequest
0 голосов
/ 02 июля 2018

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

Вот твиддл: https://ember -twiddle.com / 9ee6f28479449b7b1859e4c090490775? OpenFiles = routes.parent.js% 2C

Все имена были изменены, чтобы наши люди чувствовали себя лучше:

Основы: У меня есть модель 'parent' с асинхронным отношением hasMany к 'child'.

children: hasMany('child', {async: true}),

Затем у меня есть вычисляемое свойство, привязанное к hasMany:

sons: Ember.computed.filterBy('children', 'type', 'son'),

Затем я получаю псевдоним firstObject, чтобы получить первый элемент в массиве 'sons':

firstSon: Ember.computed.alias('sons.firstObject')

В родительском route.setupController я создаю новый объект 'son':

setupController: function(controller, model) {
    this._super(...arguments);
    var toy = this.get('store').createRecord('toy', {
      type: 'latte'
    });
    this.get('store').createRecord('child',
        {parent: model, type: 'son', toy: toy,
        name: 'Tyler'});
  }

С Ember 2.14 и Ember-Data 2.13 или любой более низкой комбинацией совпадающих версий это работает, и мой шаблон может без проблем ссылаться на parent.firstSon.

Как только я обновляю Ember-Data до 2.14, когда я достигаю желаемого маршрута, у parent.children есть правильный дочерний элемент, но sons: filterBy пусто, и поэтому псевдоним sons.firstObject также пуст. (подтверждено инспектором Ember)

Напоминание: привязанная мною твистдл действительно работает, это более сложная версия в моем приложении, которая не работает.

Простой акт обновления нарушает его - никаких других изменений кода не происходит.

Я видел некоторые похожие проблемы в github ember-data: Эта проблема: https://github.com/emberjs/data/issues/4974 похожа, но кажется, что она начинается с 2.12 и, кажется, связана с новым вызовом hasMany, который избегает загрузки данных. Я просто привязываюсь к фактическому асинхронному hasMany

https://github.com/emberjs/ember.js/issues/16258 ссылается на аналогичную проблему, но та, которая начинается только с Ember 3.0.0 и отсутствует в 2.18 - моя проблема возникает с 2.14.1 по ~ 2.18

Есть мысли о том, что могло сломаться?

1 Ответ

0 голосов
/ 03 июля 2018

Похоже, это была еще одна проблема с созданием lazy hasMany. Я позвонил в AfterModel, который я сделал:

  afterModel: function(model) {
    var parentPromise = this._super(...arguments);
    var loadChildren = () => {
      return model.get('children').then(children => {
        this.set('children', children);
      });
    };
    return (parentPromise && parentPromise.then) ? parentPromise.then(loadChildren) : loadChildren();
  },

И изменил setupController на:

  setupController: function(controller, model) {
    this._super(controller, model);

    var hasSons = model.get('sons').length > 0;
    if(!hasSons) {
      var toy = this.get('store').createRecord('toy', {...etc});
      var source = this.get('store').createRecord('child',
        {parent: model, type: 'son', toy: toy});
      this.get('children').removeObject(son).pushObject(son);
    }
  },

А теперь у меня есть прежний функционал Обратите внимание, что: this.get ( 'дети') removeObject (сын) .pushObject (сын). было рекомендовано от https://github.com/emberjs/data/issues/4974 и мне нужны оба метода removeObject и pushObject, чтобы заставить его работать

...