我的模型定义如下:
App.User = DS.Model.extend({
primaryKey: 'username',
username: DS.attr('string'),
name: DS.attr('string')
});
我的自定义适配器地图:
DS.SocketAdapter.map('App.User', {
primaryKey: 'username',
username: DS.attr('string'),
});
我通过在控制台上输入来测试这个模型:
App.User.createRecord({username:"user_1"});
var r = App.User.find("user_1");
console.log( r.serialize() );
>> Object {username: null, name: null ..... all null}
但它返回了一个“null”对象。还测试了:
App.User.find({username:"user_1"});
但这是在做远程请求。我读到Ember Data确实允许您通过ID以外的属性查找记录。
那么我告诉Ember数据自定义主键时我做错了什么?
答案 0 :(得分:0)
我认为您的问题在于您要定义username
两次。如果你通过你的适配器将你的json中的username
映射到你的模型的primaryKey,那么你应该避免在我猜的模型上做同样的事情。有不同的方法来定义映射,但适配器是最合适的位置在您的情况下,请参阅此处了解更多详细信息:https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md#mapping
改变你的代码,它应该有效:
// Model
App.User = DS.Model.extend({
name: DS.attr('string')
});
// Adapter
DS.SocketAdapter.map('App.User', {
primaryKey: 'username'
});
现在尝试创建新记录
App.User.createRecord({username:"user_1", name:"foo"});
然后按照你已经做过的id找到记录:
var r = App.User.find("user_1");
此
console.log( r.serialize() );
至少应该给你:
>> Object {name: "foo" ...}
希望有所帮助