【问题标题】:Ember belongsTo relation disappearing with localstorage adapterEmber belongsTo 关系随着本地存储适配器消失
【发布时间】:2014-06-26 20:47:59
【问题描述】:

我正在使用本地存储适配器。我有两个对象:一个流和一个参数,一个流hasMany 参数,同样还有一个参数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})
});

【问题讨论】:

  • 只是为了澄清。 - 假设您有一个带有两个参数对象 (orgFlowParam1 & orgFlowParam2) 的原始流 (orgFlow) - 当您从 dupFlow 和所有内容创建带有 cloneFlowParam1cloneFlowParam2cloneFlow 时看起来不错 - 你做了一个普通的旧 F5 刷新

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


【解决方案1】:

抱歉,我的 cmets 已超时。我可以稍后修复它们,只是想确保预刷新副本上的 Ember-Data 关系保持不变。

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

更新:

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

【讨论】:

  • 嗯似乎不起作用。顺便说一句,我的关系都是异步的,所以我想知道它们是否没有正确加载。但是我用来测试的对象很少,但即使过了一分钟它们也没有加载。
  • 是的,我最初有App.ApplicationSerializer = DS.LSSerializer;。我刚刚添加了.extend();,不幸的是它仍然不起作用。
  • 我查看了localStorage中的数据,实际上甚至没有一个流属性被持久化,所以我想知道是序列化程序不起作用的错误,还是我的代码不知何故没有正确保存。 isDirty 位在创建对象时是错误的,但是查看 localStorage 它表明没有保存任何流属性。
【解决方案2】:

好的,我通过使 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,但我不确定如何执行此操作。如果我有时间弄清楚,我会修改这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多