在我的React / Meteor应用程序中,我试图将一个带有状态数据的对象传递给服务器上的方法,以便插入到数据库中。然而,似乎存在将对象从React组件传递到Meteor方法的问题 - 其中一个子对象最终在Meteor方法中,但它的所有子对象都消失了。除了使用check()
以确保它是Object
:
'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方法之前的每一步都应该存在。我在调用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
,我 KNOW 是直接从数据库中获取对象的有效副本,结果相同:
meteor:PRIMARY> db.EncounterData.findOne()
...
"impression" : {
"patientId" : "47de32b428d8c4aaac284af3",
"appointmentId" : "TwL7DF9FoXPRgmrjR",
"fields" : [
{
"patientId" : "47de32b428d8c4aaac284af3",
"diagnosis" : {
}
}
]
},
...
我想我疯了。
答案 0 :(得分:0)
所以你的问题归结为this.setState
is an asynchronous function,所以当你进行Meteor调用时,this.state
还没有实际更新。因此,您需要等待this.setState
来电完成。唯一的方法是使用React lifecycle methods。您可以使用componentWillUpdate
(在下一个渲染之前调用)或componentDidUpdate
(在下一个渲染之后调用)。
var MyComponent = React.createClass({
save: function() {
...
case 'impression':
this.setState({ impressionData: data }, this.callServerMethod);
break;
...
},
// This is one of the React lifecycle methods
componentWillUpdate: function(nextProps, nextState) {
// Put your Meteor call here
// Make sure to use nextState instead of this.state
// This way you know that this.state has finished updating
}
});
答案 1 :(得分:0)
我自己解决了这个问题 - 结果是我将SimpleSchema对象导入为默认值,但将SimpleSchema对象导出为named。因此SimpleSchema对象无效。