2016-08-16 44 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

相关问题