我使用本地存储适配器创建了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)。
以下是Ember发送到我服务器的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')
实现路由以检索它。
答案 0 :(得分:3)
当您使用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'))
})
答案 1 :(得分:1)
Ember Data不会创建ID,没有任何东西可以阻止它生成非唯一ID。当涉及gecko
记录时,它不是真相的来源,您的数据库是,因此id生成属于db。这是POST与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");
});