我试图执行异步验证我的Vue.js组件之一,使用vue-validator,跟随this example。我想检查用户提供的电子邮件是否已被使用。自定义异步vue验证器打破验证组件
这是验证器实现我目前正在挣扎:
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="[email protected]"
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
发布正确,并收到预期的返回值(只是一个json_encoded响应true/false
),我看到相应的console.log()
输出('success', 'error', 'catch'
),所以我猜测返回值为检查函数isn' t正确并导致vue-validator
失败。
Vue.http
虽然返回Promise
,所以根据文档和上面链接的示例,应该没问题。我也试图从.then()
子句中返回true
或false
,但仍然Vue.http
返回Promise
(这显然困扰vue-validator
- 也许Promise
对象,我返回的形式vue-validator
预计不会)。
对此有任何提示吗?
在撰写本文时,我还在vue 1.0.16(但已经在'vue-validator 2.0.0'上),更新了vue到'vue 1.0.21'解决了这个问题。非常感谢! – falloutghst