EmberJS / Ember-data:尽管存在所有ID,但hasMany集合不完整

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EmberJS / Ember-data:尽管存在所有ID,但hasMany集合不完整相关的知识,希望对你有一定的参考价值。

安装版本

ember-cli   2.14.2
ember-data  2.14.10

一点看法:

我有一个名为menu的服务,它在计算属性中执行存储查询。其中一个商店查询表现得相当奇怪。它从一个功能齐全的JSON API中获取模型名称product-segment下的所有记录。该模型与名为product的模型有n-n关系,通过hasMany DS对象引用:

型号/产品segment.js

export default DS.Model.extend({

    products: DS.hasMany('product'),
    // ...
});

车型/ product.js

export default DS.Model.extend({

    productSegments: DS.hasMany('product-segment'),
    // ...
})

问题:

现在,当我获取这些product-segment模型时,我将API指向{ include: 'products' },并且API按要求执行。该响应包括针对特定product的15个相关product-segment模型,这是正确的。

(让我们称这个特殊的product-segment段x,它是我下面所有调试信息的主题)

但是,在任何时候,从任何上下文访问段x上的关系集合,只会返回12个模型,因此缺少3个模型。我目睹了与其他product-segment模型类似的问题,所以我不认为这是一个特定模型的问题。

更多的观点

我最初认为我正在处理某种竞争条件,并确保我创建了一个计算属性 - test - 以找出,并且我将{{menu.test}}倾倒到我的视图中以搔痒计算的道具。

这是services/menu.js里面的最低限度信息

export default Service.extend({

    store: inject(),

    activeProductSegment: null,

    // As a note: this does not trigger an infinite loop
    productSegments: computed('store.product.[]', 'store.product-segment.[]', function() {
        return get(this, 'store').findAll('product-segment', { include: 'products' });
    }),

    test: computed('activeProductSegment', function() {
        let segment = get(this, 'activeProductSegment');

        if (segment) {
            console.log(segment.hasMany('products').ids());
            console.log(get(segment, 'products').mapBy('id'));
        }
    }),
});

属性activeProductSegment通过组件的动作设置为不同的product-segment模型实例,如下所示:

export default Component.extend({
    menu: inject(), // menu service is injected here...

    actions: {
        setProductSegment(segment) {
            get(this, 'menu').set('activeProductSegment', segment);
        }
    }
});

动作本身按预期工作,实际上与我的问题无关。 activeProductSegment永远不会以任何其他方式更新。视图传递此动作product-segment模型对象:

{{#each menu.productSegments as |segment|}}
    <li {{action 'setProductSegment' segment}}>{{segment.name}}</li>
{{/each}}

麻烦从这里开始

我通过单击其关联的menu.activeProductSegment元素将<li>设置为分段x。

当我现在尝试获得段x的所有相关product模型时,返回的集合中仅存在15个模型中的12个。为了确保JSON响应非常好(即类型定义等是正确的),我检查了在段x处注册的product ID的数量。我记录了以下行(下面的日志上下文位于上面的Ember.Service片段中):

console.log(segment.hasMany('products').ids());

这给了我一个包含15个正确ID的数组,因此段x具有它应该具有的所有id。这些id的所有product模型都已包含在响应中,因此我认为某些异步数据应该没有问题。不过,下面一行给了我一个12个id的数组:

console.log(get(segment, 'products').mapBy('id'));

我尝试将2个日志放入2秒setTimeout,但结果保持相同:

This is the 2 logs

我开始认为这是一个错误,因为我注意到第一次id没有模型时,第一次下一个ID低于前面的ID。

上面的更新我在响应中尝试了不同的顺序,并注意第二个和第三个id:"7", "6"。猜猜这不是问题:

enter image description here

除非我误解,否则模型应该是实时的,因此任何关系都应该在数据可用时更新。我认为这不太可能与格式错误的数据有关。

尽管事实上所有必要的id都在hasMany关系对象上正确注册,但是我们不需要等待任何异步/网络数据的到达,这可能是hasMany关系集中缺少模型的原因?什么可能是解决问题的合适方案?

答案

我知道它似乎与异步问题无关,但我仍然会尝试将hasMany定义为不同步:

products: DS.hasMany('product', {async: true}),

以上是关于EmberJS / Ember-data:尽管存在所有ID,但hasMany集合不完整的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EmberJS 应用程序中启用 CORS?

在将查询响应分配给模型字段时丢失大量的ember-data类属性

Ember-data 嵌入记录当前状态?

Ember-data:创建一条记录(如果不存在)?

emberjs 和 Foundation4

Ember 数据 JSON-RPC 请求示例