我已经离开了余烬一段时间,我最近又回到了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')
});