我使用本地存储适配器创建了一个Ember应用程序的原型。
我现在试图将应用程序转换为使用带有后端存储的Ember Data REST适配器。
在应用程序的本地存储版本中,Ember在保存新记录之前生成一个id(即使该记录从未保存)。
例如,在我的本地存储应用程序中,我可以在两个地方记录id
var gecko = this.store.createRecord('gecko', {
date: new Date(),
type: "gecko",
});
console.log(gecko.id, "gecko.id before save");
gecko.save();
console.log(gecko.id, "gecko.id");
相比之下,在我使用后端存储的REST适配器制作的应用程序版本中,id没有记录。
当我检查Ember发送到服务器的数据时,没有包含id(可能是因为从未生成id)。
这是json烬发送到我的服务器
gecko: { type: "alloc", date: "2015-05-30T13:28:27.539Z"}
我假设我应该保存Ember在我的服务器上生成的id(这当然允许它通过id检索记录,如果我的服务器实现了这一点)。
问题:为什么没有生成id ?
这是代码
App = Ember.Application.create();
App.Router.map(function() {
this.route("gecko", { path: "/" });
});
App.ApplicationAdapter = DS.RESTAdapter.extend({
//haven't actually any created any code for this part yet
});
App.ApplicationStore = DS.Store.extend({
adapter: App.ApplicationAdapter.create()
});
App.Gecko = DS.Model.extend({
type: DS.attr('string'),
date: DS.attr('date')
})
App.GeckoRoute = Ember.Route.extend({
model: function() {
//currently does nothing. originally I tried to do `return this.store.find('gecko') but since there are no records yet on the backend, it's returning null which leads to an error which Array cannot map over
},
});
App.GeckoController = Ember.Controller.extend({
actions: {
createGeckoButtonClicked: function(){
var gecko = this.store.createRecord('gecko', {
date: new Date(),
type: "gecko",
});
console.log(gecko.id, "gecko.id before save"); //null
gecko.save();
console.log(gecko.id, "gecko.id"); //null
}
}
注:我不确定它是否相关,但我觉得我在一个鸡/蛋的情况下与路线,因为我不能返回任何条目之前,我已经创建了他们。
因此,我试图设置Ember应用程序,以便能够将条目POST到服务器,然后我将实现使用return this.store.find('gecko')
检索它的路由。
当您使用RESTAdapter并保存模型时,ember-data期望得到一个有效的有效负载,该有效负载包含由后端生成的唯一id。
var gecko = this.store.createRecord('gecko', {
date: new Date(),
type: "gecko",
});
/*
Here ember-data expects a payload like this:
gecko: {id: 1, date: "", type: "gecko"}
The id is generated by your backend
*/
gecko.save().then(function(gecko){
console.log(gecko.get('id'))
})
Ember Data不创建id,没有任何东西可以阻止它生成非唯一id。当涉及到gecko
记录时,它不是事实的来源,您的数据库是,因此id生成属于db。这就是POST vs PUT发挥作用的地方。我想发布一个新的gecko
记录到/api/geckos
,或者我想把gecko
记录123放到/api/geckos/123
的位置。
如果数据库中没有条目,您应该仍然返回一个有效的响应:
{
geckos: []
}
还有另外两件事,你应该使用getter/setter来获取和设置属性。
var gecko = this.store.createRecord('gecko', {
date: new Date(),
type: "gecko",
});
console.log(gecko.get('id'), "gecko.id before save");
var promise = gecko.save();
而save是一个异步进程,它返回一个承诺,你可以等待以避免竞争条件。
promise.then(function(geckoRecord){
// geckoRecord and geck are the same here, but it's good to know
// it resolves the record
console.log(gecko.get('id'), "gecko.id after save");
console.log(geckoRecord.get('id'), "gecko.id after save");
});