在我的React/Meteor应用程序中,我试图将一个对象与数据从状态传递到服务器上的某个方法,以便插入到数据库中。然而,似乎有一个问题将对象从React组件传递给Meteor方法 - 其中一个子对象以Meteor方法结束,但其所有子组件都不见了。我什么都不做的目的除了使用check()
,以确保它是一个Object
:传递给Meteor.call时丢失了对象的数据
'Appointments.saveData'(dataObj) {
check(dataObj, Object);
console.log(dataObj);
// ....
}
这里有前端发生了什么:
Meteor.call('Appointments.saveData', {
vitalsData: this.state.vitalsData || {},
subjectiveData: this.state.subjectiveData || '',
physicalExamData: this.state.physicalExamData || {},
rosData: this.state.rosData || {},
impressionData: this.state.impressionData || [],
extraNotes: this.state.extraNotes || ''
}, (err, res) => {
if (res && !err) {
this.refs.toasts.success(
'Data for this encounter has been saved.',
'Records saved!'
);
} else {
this.refs.toasts.error(
'An unknown error has occurred. Reload the page and try again.',
'Error!'
);
}
});
我用结合所有我的状态变量转换成对象{}
,其在该方法中又变成dataObj
。但是,dataObj.impressionData
存在,并且是包含对象的数组,但是,数组中的任何对象都缺少数据。
例如,dataObj.impressionData[0].diagnosis
应该是一个对象,实际上,它应该是已从数据库中提取的对象的精确副本。但是,如果我console.log
它,该对象是空的。
我已经验证数据存在,因为它应该在每个步骤传递给Meteor方法之前。 I console.log
紧接在调用Meteor.call
之前以及紧接在我的方法中调用check
之后的对象。我无法理解数据缺失的原因。
我忘了什么?
编辑:我已经改变了我的代码,以便数据现在直接从ref
添加到状态。现在服务器方法可以正确接收对象。然而,在下面的代码:
if (dataObj.impressionData && dataObj.impressionData.length > 0) {
dataObj.impressionData.forEach(obj => {
console.log(obj); // obj.diagnosis exists and is as expected
const x = ICD10Codes.findOne({ _id: obj.diagnosis._id });
console.log(x); // this also works as it should
impressionFields.push({ patientId: appt.patient._id, diagnosis: x, note: obj.note, x });
});
}
设置诊断x
,我知道是直接从数据库中的对象的有效副本产生了相同的结果:
meteor:PRIMARY> db.EncounterData.findOne()
...
"impression" : {
"patientId" : "47de32b428d8c4aaac284af3",
"appointmentId" : "TwL7DF9FoXPRgmrjR",
"fields" : [
{
"patientId" : "47de32b428d8c4aaac284af3",
"diagnosis" : {
}
}
]
},
...
我想我疯了。
你确定'this'实际上是指向你的React组件吗?你在哪里打电话给Meteor代码? –
@MatthewHerbst是的 - 我实际上'console.log(this.state.impressionData)'在Meteor.call之前,并且数据在那里很好。它是React组件中的一个函数,在按下“保存”按钮并存储子组件的数据后调用。 – user3259354
你能告诉我们功能和保存吗?我想你的问题可能是因为状态尚未设置。请记住'这。setState'是一个**异步**调用,所以你必须使用生命周期方法来确保它的调用已经完成。 –