2017-10-10 90 views
1

場景:呼叫Meteor.call()和wait裏面`前:insert`掛鉤

我試圖插入一個Appointment使用autoform只有當日期不衝突的客戶端。下面是獲取簡要想法的代碼。

{{#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 
} 

雖然,我建議你重新考慮你的流量。檢查鉤子中的「衝突」是錯誤的。您應該在「用戶輸入的數據」步驟中執行此操作,並相應地禁用/啓用「提交」按鈕。

+0

檢查「用戶輸入數據」的衝突在性能方面沒有可行的解決方案(即使我使用'_.debounce'來控制請求)。在鉤子上檢查它只需調用一次服務器,它適合我的應用程序需求。 –

+0

@AnkurSoni當用戶已經在現場輸入數據時,我並不是指「連續檢查」,只是一次。當然,如果你需要_all_字段來檢查衝突,那就沒有意義了:) – Styx