加载空/可选嵌入式与Ember Data的多种关系

时间:2014-11-01 14:34:21

标签: ember.js ember-data

如果大多数人在加载嵌入式Ember模型时遇到问题,我就会遇到完全相反的问题。

当我尝试解析包含embedded关系的记录时,Ember会抛出错误,其中hasMany关系的内容为空数组。

如何使嵌入式Ember数据将多个关系设为可选或可空?

我有一个模特..

App.Beat = DS.Model.extend({

  notes: DS.hasMany('note', {
    embedded: 'always', 
    defaultValue: []
  }),

  ...
})

此模型是Bar模型中的关联,它是Track模型中的关联。那些在这里真的不重要。

这些嵌入的hasMany关系使用以下序列化程序进行序列化。

// http://bl.ocks.org/slindberg/6817234
App.ApplicationSerializer = DS.RESTSerializer.extend({

  // Extract embedded relations from the payload and load them into the store
  normalizeRelationships: function(type, hash) {
    var store = this.store;

    this._super(type, hash);

    type.eachRelationship(function(attr, relationship) {
      var relatedTypeKey = relationship.type.typeKey;

      if (relationship.options.embedded) {
        if (relationship.kind === 'hasMany') {
          hash[attr] = hash[attr].map(function(embeddedHash) {
            // Normalize the record with the correct serializer for the type
            var normalized = store.serializerFor(relatedTypeKey).normalize(relationship.type, embeddedHash, attr);

            // If the record has no id, give it a GUID so relationship management works
            if (!normalized.id) {
              normalized.id = Ember.generateGuid(null, relatedTypeKey);
            }

            // Push the record into the store
            store.push(relatedTypeKey, normalized);

            // Return just the id, and the relation manager will take care of the rest
            return normalized.id;
          });
        }
      }
    });
  }
});

成功反序列化并加载商店中的记录后,应用程序中的某个位置bars上的Track属性被访问。如果Bar beats中有一个beats没有任何notes(因为它是没有播放音符的休息节拍),那么以下错误是Ember.assert("...", Ember.A(records).everyProperty('isEmpty', false)); 抛出:

  

"你抬起了酒吧'关系''但是没有加载一些相关的记录。要么确保它们都与父记录一起加载,要么指定关系是异步的(DS.hasMany({async:true}))"

此错误来自ember-data.js中的以下断言:hasRelationship:

records

其中barsnotes的数组,其中包含可选包含embedded的节拍。

那么,如何制作hasMany {{1}}关系可选,以便接受一个空的记录数组?

2 个答案:

答案 0 :(得分:1)

我建议在最近的Ember Data测试版(10或11)中使用EmbeddedRecordsMixin,然后查看您是否仍然遇到嵌入式记录问题。

您的应用程序序列化程序:

App.ApplicationSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin,{
   // probably nothing required here yet
});

然后在你的Beat模型序列化器中:

App.BeatSerializer = App.ApplicationSerializer.extend({
  attrs: {
    notes: { embedded: 'always' }
  }
});

答案 1 :(得分:0)

它转变为我的isEmpty模型上的bar与在Ember断言中测试的属性冲突。重命名此属性使一切正常。