Ember属于使用localstorage适配器消失的关系

时间:2014-06-26 20:48:00

标签: javascript ember.js local-storage ember-data

我使用的是localstorage适配器。我有两个对象:一个Flow和一个Param,一个Flow hasMany Params,同样一个Param belongsTo一个流。我的代码中有一个函数,它复制了另一个对象。当我从控制器调用该函数时,一切正常(并且参数的isSaving位为false,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})
});

2 个答案:

答案 0 :(得分:0)

抱歉,我的评论超时了。我可以稍后修复它们,只是想确保预先刷新重复的Ember-Data关系正在持续。

你试过DS.belongsTo('flow',{embedded: 'always'})吗? embedded Docs。我在我的应用程序中使用它们,我承认这有点尴尬,但在刷新时,商店模型重新获得他们需要的冠军。

<强>更新

因此,如果您没有为此设置序列化程序,那可能是导致问题的原因,因为它处理关系工作。在那里扔FlowApp.ApplicationSerializer = DL.LSSerializer.extend();。看看这个part of the README。这是一件很容易忽视的小作品。

答案 1 :(得分:0)

好吧,我通过使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关系是异步时,get(这是Ember.get的简写)每次都返回undefined。我认为更全面的解决方案将涉及找出如何访问商店而不是使用get,但我不知道如何做到这一点。如果我有时间搞清楚,我会修改这个答案。