在我的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'是一個**異步**調用,所以你必須使用生命週期方法來確保它的調用已經完成。 –