情境:
我正在尝试仅在日期不冲突时使用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}}
我正在添加以上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);
问题:
这里的问题是即使从error
返回Meteor.call()
并将document
插入数据库,表单也会被提交。我知道Meteor.call()
是异步调用,但我怎么能等待结果呢?只有这样我才能继续提交,如果没有错误。
答案 0 :(得分: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
}
虽然,我建议你重新考虑一下你的流程。检查钩子中的“碰撞”是错误的。您应该在“用户输入的数据”步骤中执行此操作,并相应地禁用/启用“提交”按钮。