Ember belongsTo关系随着本地存储适配器消失

Ember belongsTo relation disappearing with localstorage adapter

本文关键字:存储 适配器 消失 belongsTo 关系 Ember      更新时间:2023-09-26

我使用的是本地存储适配器。我有两个对象:一个流和一个参数,一个流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,但我不确定如何做到这一点。如果我有时间想明白的话,我会修改这个答案的。