2016-08-16 8 views
2

私のReact/Meteorアプリケーションでは、状態のデータを持つオブジェクトをサーバー上のメソッドに渡して、データベースに挿入しようとしています。しかし、ReactコンポーネントからMeteorメソッドにオブジェクトを渡す際に問題があるようです。子オブジェクトの1つはMeteorメソッドで終了しますが、すべての子プロセスは終了しています。私はそれがObjectであることを確認するために使用check()除くオブジェクトに何もしない: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メソッドに渡す前に各ステップでデータが存在することを確認しました。私console.logMeteor.callを呼び出す直前のオブジェクトと、私のメソッドでcheckを呼び出した直後のオブジェクト。なぜ私の人生はデータが欠落しているのか理解できません。

私は何を忘れていますか?

編集:データがrefから直接状態に追加されるようにコードを変更しました。これで、サーバーメソッドはオブジェクトを適切に受け取ります。ただし、次のコードで:

meteor:PRIMARY> db.EncounterData.findOne() 
... 
    "impression" : { 
     "patientId" : "47de32b428d8c4aaac284af3", 
     "appointmentId" : "TwL7DF9FoXPRgmrjR", 
     "fields" : [ 
      { 
       "patientId" : "47de32b428d8c4aaac284af3", 
       "diagnosis" : { 

       } 
      } 
     ] 
    }, 
... 

は私が私を考える:

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に、私はを知っストレートデータベースからオブジェクトの有効なコピーが、同じ結果が得られています狂ったよ。

+0

'this'は実際にあなたのReactコンポーネントを指していますか?流星コードはどこで呼びますか? –

+0

@MatthewHerbstはい - 私は実際には 'Meteor.call'の直前に' console.log(this.state.impressionData) 'というデータがあります。これはReactコンポーネント内の関数であり、 'save'ボタンが押され子コンポーネントからのデータが保存された後に呼び出されます。 – 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

これは問題を解決しません - [here's](https://lambda.sx/ODr.png)コンソールの画面のスクリーンショットです。最初の '[Object]'は、 'impressionData'に対して' nextState'(以前は 'this.state')が持っていたものです。 2番目の方法は、流星法が受け取る方法です。ここで欠落しているのは、診断オブジェクトの内容です。他のすべてのオブジェクトは、他のネストされたオブジェクトも含めて問題ありません。 – user3259354

関連する問題