Jef*_*amp 7 javascript has-many ember.js ember-data
安装版本
ember-cli 2.14.2
ember-data 2.14.10
Run Code Online (Sandbox Code Playgroud)
一点看法:
我有一个名为menu在计算属性中执行存储查询的服务.其中一个商店查询表现得相当奇怪.它product-segment从功能齐全的JSON API中获取模型名称下的所有记录.此模型与product通过hasManyDS对象引用的模型有nn关系:
型号/产品segment.js
export default DS.Model.extend({
products: DS.hasMany('product'),
// ...
});
Run Code Online (Sandbox Code Playgroud)
车型/ product.js
export default DS.Model.extend({
productSegments: DS.hasMany('product-segment'),
// ...
})
Run Code Online (Sandbox Code Playgroud)
问题:
现在,当我获取这些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'));
}
}),
});
Run Code Online (Sandbox Code Playgroud)
通过组件的操作将属性activeProductSegment设置为不同的product-segment模型实例,如下所示:
export default Component.extend({
menu: inject(), // menu service is injected here...
actions: {
setProductSegment(segment) {
get(this, 'menu').set('activeProductSegment', segment);
}
}
});
Run Code Online (Sandbox Code Playgroud)
动作本身按预期工作,实际上与我的问题无关.activeProductSegment永远不会以任何其他方式更新.视图传递此动作product-segment模型对象:
{{#each menu.productSegments as |segment|}}
<li {{action 'setProductSegment' segment}}>{{segment.name}}</li>
{{/each}}
Run Code Online (Sandbox Code Playgroud)
麻烦从这里开始
我通过单击其关联元素设置menu.activeProductSegment为分段x<li>.
当我现在尝试获得段x的所有相关product模型时,返回的集合中只存在15个模型中的12个.为了确保JSON响应非常好(即类型定义等是正确的),我检查了在段x注册的ID 数量.我记录了以下行(以下日志的上下文位于上面的代码段中):productEmber.Service
console.log(segment.hasMany('products').ids());
Run Code Online (Sandbox Code Playgroud)
这给了我一个包含15个正确ID的数组,因此段x具有它应该具有的所有id.product这些id的所有模型都已包含在响应中,因此我认为某种异步数据应该没有问题.不过,下面一行给了我一个12个id的数组:
console.log(get(segment, 'products').mapBy('id'));
Run Code Online (Sandbox Code Playgroud)
我尝试将2个日志放入2秒setTimeout,但结果保持相同:
我开始认为这是一个错误,因为我注意到第一次id没有模型时,第一次下一个ID低于前面的ID.
上面的更新我在响应中尝试了不同的顺序,并注意第二个和第三个ID : "7", "6". 猜猜这不是问题:
除非我误解,否则模型应该是实时的,因此任何关系都应该在数据可用时更新.我认为这不太可能与格式错误的数据有关.
hasMany尽管事实上所有必要的id都在hasMany关系对象中正确注册,但是我们不需要等待任何异步/网络数据的到达,这可能是因为关系集合中缺少模型的原因是什么?什么可能是解决问题的合适方案?
小智 0
我知道它似乎与异步问题无关,但我仍然会尝试将 hasMany 定义为非异步:
products: DS.hasMany('product', {async: true}),Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |