首页 文章

升级到Ember-Data 2.14打破了hasMany上的计算过滤器

提问于
浏览
0

我曾试图在旋转中重现这个问题,但不幸的是,旋风总是成功,但我希望这个错误对某人来说听起来很熟悉,他们可以指出我正确的方向 .

这是旋转:https://ember-twiddle.com/9ee6f28479449b7b1859e4c090490775?openFiles=routes.parent.js%2C

所有名称都已更改,以使我们的数据安全人员感觉更好:

基础知识:我有一个'父母'模型,与'child'有一个异步'hasMany'关系 .

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有正确的子,但是子:filterBy是空的,因此sons.firstObject的别名也是空的 . (通过Ember检查员验证)

提醒:我链接的旋转确实有效,这是我的应用程序中更复杂的版本失败 .

简单的升级行为打破了它 - 没有其他代码发生变化 .

我在ember-data github中看到了一些类似的问题:这个问题: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

    看起来这是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('children') . removeove(son).pushObject(son);是从https://github.com/emberjs/data/issues/4974推荐的,我确实需要removeObject和pushObject来使它工作

相关问题