【发布时间】:2016-08-04 08:39:18
【问题描述】:
我正在尝试使用vue-validator 对我的一个 Vue.js 组件执行异步验证,遵循this example。我想检查用户提供的电子邮件是否已被占用。
这是我目前正在努力解决的验证器实现:
Vue.validator('emailUnique', {
message: 'this e-mail address has already been taken',
check: function (val) {
return Vue.http({
url: '/validate/email-unique',
method: 'POST',
data: {
email: val
}
}).then(
function (response) { // success
console.log('success');
return Promise.resolve();
},
function (response) { // error
console.log('error');
return Promise.reject();
}
).catch(function(error) {
console.log('catch');
return Promise.reject();
});
}
});
我在我的组件中使用如下:
<div>
<validator name="userValidator">
<form novalidate class="form-group" v-on:submit.prevent="submitUser">
<div class="form-group">
<label for="email">E-Mail</label>
<input id="email" name="email" type="email" class="form-control"
placeholder="jon@greatesthits.com"
v-model="user.email" required v-validate:email="{ required: true, email: true, emailUnique: true }">
<div class="form-validation-error" v-if="$userValidator.email.required && $userValidator.email.touched">
<span>this field is required</span>
</div>
<div class="form-validation-error" v-if="$userValidator.email.email && $userValidator.email.touched">
<span>not a valid e-mail address</span>
</div>
<div class="form-validation-error" v-if="$userValidator.email.emailUnique && $userValidator.email.touched">
<span>this e-mail address has already been taken</span>
</div>
</div>
</form>
</validator>
</div>
不幸的是,这破坏了电子邮件的整个验证对象:
[Vue warn]: Error when evaluating expression "$userValidator.email.required && $userValidator.email.touched".
TypeError: scope.$userValidator.email is undefined
如果我不注册emailUnique 验证器,其他两个验证规则可以正常工作。
此外,对/validate/email-unique 的请求已正确发布并接收到预期的返回值(只是带有true/false 的json_encoded 响应),并且我看到了相应的console.log() 输出('success', 'error', 'catch'),所以我猜测返回检查函数的值不正确并导致vue-validator 失败。
Vue.http 确实返回了Promise,因此根据文档和上面链接的示例应该没问题。我还尝试从.then() 子句中返回true 或false,但Vue.http 仍然返回Promise(这显然困扰vue-validator——也许我要返回的Promise 对象是不是vue-validator 期望的形式?)。
这方面有什么建议吗?
【问题讨论】:
标签: validation promise vue.js