2016-08-16 58 views
2

在我的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" : { 

       } 
      } 
     ] 
    }, 
... 

我想我瘋了。

+0

你確定'this'實際上是指向你的React組件嗎?你在哪裏打電話給Meteor代碼? –

+0

@MatthewHerbst是的 - 我實際上'console.log(this.state.impressionData)'在Meteor.call之前,並且數據在那裏很好。它是React組件中的一個函數,在按下「保存」按鈕並存儲子組件的數據後調用。 – user3259354

+0

你能告訴我們功能和保存嗎?我想你的問題可能是因爲狀態尚未設置。請記住'這。setState'是一個**異步**調用,所以你必須使用生命週期方法來確保它的調用已經完成。 –

回答

0

我解決了問題我自己 - 事實證明,我是進口我SimpleSchema對象作爲默認值,但作爲命名導出我的SimpleSchema對象。 SimpleSchema對象因此無效。

0

所以你的問題歸結爲事實this.setState is an asynchronous function,所以當你做你的流星調用,this.state還沒有實際更新。因此,您需要等待this.setState電話完成。唯一的方法是使用React lifecycle methods。您可以使用componentWillUpdate(在下一個渲染之前調用)或componentDidUpdate(在下一個渲染之後調用)。

var MyComponent = React.createClass({ 
    save: function() { 
     ... 
     case 'impression': 
      this.setState({ impressionData: data }, this.callServerMetho‌​d); 
      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 
    } 
}); 
+0

這不能解決問題 - [這是](https://lambda.sx/ODr.png)控制檯顯示的屏幕截圖。第一個'[Object]'是'nextState'(以及之前的'this.state')對'impressionData'的。其次是Meteor方法接收的內容。這裏缺少的是診斷對象的內容。其他一切都很好,包括其他嵌套對象。 – user3259354