Ember - 保存模型后,如何从 promise 的成功回调中获取 id
Ember - after saving model, how to get id in success callback from promise
Ember-1.9.1 中的简单场景,Ember-Data 1.0.0-beta.14.1:
模板形式:
form
fieldset
dl
dt: label First Name:
dd: view Ember.TextField value=fields.first_name classNames='form-control'
dl
dt: label Last Name:
dd: view Ember.TextField value=fields.last_name classNames='form-control'
dl
dt: label Sex:
dd: view Ember.Select content=App.Patient.SEX prompt='Select a sex.' value=fields.sex classNames='form-control'
dl
dt: label Date of Birth:
dd: view Ember.TextField value=fields.date_of_birth type="date" classNames='form-control'
dl
dt: label Insurance Provider:
dd {{view Ember.Select content=insuranceProviders prompt='Select an insurance provider.' optionLabelPath='content.name' optionValuePath='content.id' value=currentInsuranceProvider.id classNames='form-control'}}
dl
dt: label Insurance Policy Number:
dd: view Ember.TextField value=fields.insurance_policy_number classNames='form-control'
fieldset.actions
input type='submit' value='Create Patient' click="createPatient" class='btn btn-default'
'
a.cancel href="#" click="cancel" cancel
控制器操作:
createPatient: function() {
var self = this;
var fields = this.get('fields')
fields.insurance_provider_id = this.currentInsuranceProvider.id
if (App.Patient.valid(fields)) {
var patient = this.store.createRecord('patient', fields)
patient.set('date_of_birth', new Date(moment(fields.date_of_birth).format()));
patient.set('insurance_provider', this.insuranceProviders.findBy('id', this.currentInsuranceProvider.id));
patient.save().then(function(savedPatient){
debugger
self.transitionToRoute('patient', savedPatient);
}).catch(failure);
function failure(reason) {
this.set('showError', true);
}
} else {
this.set('showError', true)
}
}
显示'patient'路线:
App.PatientRoute = Ember.Route.extend({
model: function(params) { return this.store.find('patient', params.id); }
})
JS控制台返回:
> savedPatient
< Class {id: null, store: Class, container: Container, _changesToSync: Object, _deferredTriggers: Array[0]…}
> savedPatient.get('id')
< null
为什么我无法在成功回调(调试器语句所在的位置)中获取已保存模型的 ID?它确实转换成功,但路由中的 ID 为空。如果您想在转换后编辑新创建的模型,这就会导致问题。
还尝试在回调中重新加载 savedModel,如果没有模型的 ID,这实际上是不可能的。似乎在同步页面刷新时重新加载商店之前,id 不可用,使用服务器和模型的服务器 id 更新它。这怎么可能在回调中更新商店?
已更新
回答:Rails 后端未正确呈现 JSON。
def create
patient = Patient.create(patient_params)
render json: { :patient => [patient] }
end
如果您执行 patient.save()
,则会发送 POST
请求。如果您想以标准方式执行此操作,那么在将记录保存在数据库中后,您应该 return Ember 理解的有效响应。
POST /patients
响应示例:
{
"patient": [{
"id: "newly-created-id",
// all the rest of the fields
}]
}
您仍然可以 return 它以不同的方式,但您应该使用 Ember 的序列化程序对其进行转换。但是,您必须在回复中提供 id
。
Ember-1.9.1 中的简单场景,Ember-Data 1.0.0-beta.14.1:
模板形式:
form
fieldset
dl
dt: label First Name:
dd: view Ember.TextField value=fields.first_name classNames='form-control'
dl
dt: label Last Name:
dd: view Ember.TextField value=fields.last_name classNames='form-control'
dl
dt: label Sex:
dd: view Ember.Select content=App.Patient.SEX prompt='Select a sex.' value=fields.sex classNames='form-control'
dl
dt: label Date of Birth:
dd: view Ember.TextField value=fields.date_of_birth type="date" classNames='form-control'
dl
dt: label Insurance Provider:
dd {{view Ember.Select content=insuranceProviders prompt='Select an insurance provider.' optionLabelPath='content.name' optionValuePath='content.id' value=currentInsuranceProvider.id classNames='form-control'}}
dl
dt: label Insurance Policy Number:
dd: view Ember.TextField value=fields.insurance_policy_number classNames='form-control'
fieldset.actions
input type='submit' value='Create Patient' click="createPatient" class='btn btn-default'
'
a.cancel href="#" click="cancel" cancel
控制器操作:
createPatient: function() {
var self = this;
var fields = this.get('fields')
fields.insurance_provider_id = this.currentInsuranceProvider.id
if (App.Patient.valid(fields)) {
var patient = this.store.createRecord('patient', fields)
patient.set('date_of_birth', new Date(moment(fields.date_of_birth).format()));
patient.set('insurance_provider', this.insuranceProviders.findBy('id', this.currentInsuranceProvider.id));
patient.save().then(function(savedPatient){
debugger
self.transitionToRoute('patient', savedPatient);
}).catch(failure);
function failure(reason) {
this.set('showError', true);
}
} else {
this.set('showError', true)
}
}
显示'patient'路线:
App.PatientRoute = Ember.Route.extend({
model: function(params) { return this.store.find('patient', params.id); }
})
JS控制台返回:
> savedPatient
< Class {id: null, store: Class, container: Container, _changesToSync: Object, _deferredTriggers: Array[0]…}
> savedPatient.get('id')
< null
为什么我无法在成功回调(调试器语句所在的位置)中获取已保存模型的 ID?它确实转换成功,但路由中的 ID 为空。如果您想在转换后编辑新创建的模型,这就会导致问题。
还尝试在回调中重新加载 savedModel,如果没有模型的 ID,这实际上是不可能的。似乎在同步页面刷新时重新加载商店之前,id 不可用,使用服务器和模型的服务器 id 更新它。这怎么可能在回调中更新商店?
已更新
回答:Rails 后端未正确呈现 JSON。
def create
patient = Patient.create(patient_params)
render json: { :patient => [patient] }
end
如果您执行 patient.save()
,则会发送 POST
请求。如果您想以标准方式执行此操作,那么在将记录保存在数据库中后,您应该 return Ember 理解的有效响应。
POST /patients
响应示例:
{
"patient": [{
"id: "newly-created-id",
// all the rest of the fields
}]
}
您仍然可以 return 它以不同的方式,但您应该使用 Ember 的序列化程序对其进行转换。但是,您必须在回复中提供 id
。