对Ember Data 1.13感到困惑对侧载数据进行序列化

时间:2015-07-20 05:11:30

标签: ember.js ember-data

我已经离开了余烬一段时间,我最近又回到了1.13版的Ember-Data 1.13。我最初对新的JSON API格式感到兴奋,因为根据更改文档中给出的示例,我认为它可以轻松支持sideloaded记录。

{
  data: { 
    id: '1', 
    type: 'user', 
    attributes: {
      name: 'wecc'
    }, 
    relationships: {
      accounts: {
        data: [
          { id: '1', type: 'account' },
          { id: '2', type: 'account' }
        ]
      }
    }
  },
  included: [{ 
    id: '1',
    type: 'account',
    attributes: {
      email: 'wecc@sweden.se'
    }
  }, {
    id: '2',
    type: 'account',
    attributes: {
      email: 'wecc@greece.gr'
    }
  }]
}

我的理解是,如果我将有效负载规范化为上述,那么它将为我处理我的关系并在商店中创建记录。似乎情况并非如此,我希望有人可以解释为了在商店中正确创建记录我必须做些什么。

要清楚这是我从我的控制器运行的代码,

getData: function() {
  var self = this;
  this.store.findRecord("user", 1).then(function(user) {
    console.log(user);
    console.log(user.get('name'));
    console.log(self.store.peekAll('account'));
  });

}

而且我期待peekAll能给我看两条记录,但事实并非如此。记录用户和user.get('name')确实有效。谢谢!

更新: 现在,每当我尝试加载它时,我都会遇到控制台错误Cannot read property '_internalModel' of undefined。这是在函数

function _find(adapter, store, typeClass, id, internalModel, options) {
  var snapshot = internalModel.createSnapshot(options);
  var promise;
  if (!adapter.findRecord) {
    Ember.deprecate("Adapter#find has been deprecated and renamed to `findRecord`.");
    promise = adapter.find(store, typeClass, id, snapshot);
  } else {
    promise = adapter.findRecord(store, typeClass, id, snapshot);
  }
  var serializer = serializerForAdapter(store, adapter, internalModel.type.modelName);
  var label = "DS: Handle Adapter#find of " + typeClass + " with id: " + id;

  promise = Promise.cast(promise, label);
  promise = _guard(promise, _bind(_objectIsAlive, store));

  return promise.then(function (adapterPayload) {
    Ember.assert("You made a request for a " + typeClass.typeClassKey + " with id " + id + ", but the adapter's response did not have any data", adapterPayload);
    return store._adapterRun(function () {
      var requestType = get(serializer, "isNewSerializerAPI") ? "findRecord" : "find";
      var payload = normalizeResponseHelper(serializer, store, typeClass, adapterPayload, id, requestType);
      //TODO Optimize
      var record = pushPayload(store, payload);
      return record._internalModel;
    });
  }, function (error) {
    internalModel.notFound();
    if (internalModel.isEmpty()) {
      internalModel.unloadRecord();
    }

    throw error;
  }, "DS: Extract payload of '" + typeClass + "'");
}

此处参考的还有我正在使用的模型(我曾尝试使用和不使用嵌入式)

var User = DS.Model.extend({
  name: DS.attr('string'),
  accounts: DS.hasMany('account', {embedded: 'always'})
});
var Account = DS.Model.extend({
  email: DS.attr('string'),
  user: DS.belongsTo('user')
});

0 个答案:

没有答案