我使用的是本地存储适配器。我有两个对象:一个流和一个参数,一个流hasMany
参数,同样一个Param belongsTo
一个流。我的代码中有一个函数,它复制了另一个对象。当我从控制器调用函数时,一切工作正常(参数的isSaving
位为假,isDirty
位也为假);
然而,当我重新加载页面时,belongsTo
关系没有加载,尽管所有其他关系/属性加载良好。
这是复制函数:
// elem is the Flow I'm duplicating, newFlowJSON is the JSON I'll use to create it.
function dupFlow(_store, newFlowJSON, elem) {
var newFlow = _store.createRecord('flow', newFlowJSON);
newFlow.save();
var newFlowParams;
newFlow.get('params').then(function(params) {
newFlowParams = params;
elem.get('params').then(function(p) {
var params = p.toArray();
for (var i=0; i < params.length; i++) {
var newParamJSON = params[i].toJSON();
delete newParamJSON.id;
delete newParamJSON.flow;
var newParam = _store.createRecord('param', newParamJSON);
newFlowParams.pushObject(newParam);
newParam.set('flow', newFlow);
newParam.save();
}
});
});
// couldn't figure out a good way to save the newFlow after all the params were pushed
setTimeout(function() {
newFlow.save();
}, 500);
}
我的简化模型:
App.Flow = DS.Model.extend({
title: DS.attr('string'),
params: DS.hasMany('param', {async: true})
});
App.Param = DS.Model.extend({
paramName: DS.attr('string'),
flow: DS.belongsTo('flow', {async: true})
});
对不起,我的评论超时了。我可以稍后修复它们,只是想确保pre-Refresh在dup上的Ember-Data关系是正常的。
你试过DS.belongsTo('flow',{embedded: 'always'})
吗?嵌入的文档。我在我的应用程序中使用它们,我承认这有点尴尬,但在刷新商店模型时,重新获得他们需要的东西,就像冠军一样。
更新:
因此,如果您没有为此设置序列化器,这很可能是导致问题的原因,因为它处理关系工作。扔个FlowApp.ApplicationSerializer = DL.LSSerializer.extend();
进去。请查看README的这一部分。这是一个很容易被忽略的小片段
好吧,我通过使belongsTo
关系不是异步来解决我的问题。考虑到Ember已经说过异步关系最终将成为标准,这似乎不是一个很好的解决方案。但我认为目前没有更好的解决办法。
这个问题似乎起源于JSONSerializer。
serializeBelongsTo: function(record, json, relationship) {
var key = relationship.key;
var belongsTo = get(record, key);
key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo") : key;
if (isNone(belongsTo)) {
json[key] = belongsTo;
} else {
json[key] = get(belongsTo, 'id');
}
if (relationship.options.polymorphic) {
this.serializePolymorphicType(record, json, relationship);
}
},
现在,这里的问题是belongsTo.get
不返回承诺。因此,在我的代码中,当belongsTo关系是async时,get
(Ember.get的简写)每次都返回undefined。我认为一个更全面的解决方案将涉及弄清楚如何访问商店,而不是使用get
,但我不确定如何做到这一点。如果我有时间想明白的话,我会修改这个答案的。