2017-10-10 13 views
1

シナリオフックinsert`:コールMeteor.call()と前に `内部で待つ:

を私は日付が衝突しないだけautoformを使用してクライアントのAppointmentを挿入しようとしています。以下は簡単なアイディアを得るためのコードです。

{{#autoForm id='insertAppointmentForm' collection=appointment type="insert" 
       doc=this validation="browser"}} 
    <fieldset> 
     <!-- All fields here --> 
    </fieldset> 
    <button type="submit" class="btnn"> Create </button> 
{{/autoForm}} 

私は以下のようにオートフォーム上のinsertコードにフックを追加してい、

var hooksObject = { 
    before: { 
    insert: function(doc) { 
     console.log(doc); 
     Meteor.call('checkAppointmentClash', doc, function(error, response){ 
      if(error){ } else { } 
     }); 
     return doc; // I want to wait here 
    } 
    }, 
    onSuccess: function(formType, result) {}, 
    onError: function(formType, error) {} 
}; 

AutoForm.addHooks(['insertAppointmentForm'], hooksObject, true); 

問題:

問題ここでは、errorMeteor.call()および挿入から返された場合でも、フォームが送信されることをですdocumentをデータベースに追加します。私はMeteor.call()が非同期呼び出しであることを知っていますが、結果を待つ方法はありますか?私はエラーがなければ提出を続行したい。

答えて

2

フックは非同期で動作できます。 documentationから:

これらの関数は、必要に応じて非同期タスクを実行できます。非同期性が必要ない場合は、文書または修飾子を返すか、falseを返して送信を取り消します。何も返さない場合は、最終的にthis.result()に電話して、ドキュメントまたは修飾子のいずれかを渡すか、またはfalseを送信して送信をキャンセルする必要があります。

ので、コードは次のようになります、私はあなたがあなたの流れを再考することをお勧めしたい

insert: function(doc) { 
    // note using() => {} to bind `this` context 
    Meteor.call('checkAppointmentClash', doc, (error, response) => { 
    if(error) { 
     this.result(false); 
    } else { 
     this.result(doc); 
    } 
    }); 
    // return nothing 
} 

が。フックで「衝突」をチェックするのは間違いです。あなたは "ユーザーが入力したデータ"ステップでこれを行い、それに応じて "Submit"ボタンを無効/有効にする必要があります。

+0

「ユーザー入力データ」のチェッククラッシュは、(リクエストを制御するために '_.debounce'を使用しても)パフォーマンス面で実現可能な解決策ではありません。フックでそれをチェックすると、サーバーへの呼び出しが1回だけで、アプリケーションのニーズに合っています。 –

+0

@AnkurSoniユーザーが既にフィールドにデータを入力しているときに、「一貫してチェックする」という意味ではありませんでした。もちろん、それは意味がありません、もしあなたが衝突をチェックするために_all_フィールドが必要なら:) – Styx

関連する問題