我想我几乎找到了解决问题的方法,但我仍然需要一点调整。
我有一个@RestController
,我这样做是为了检查用户是否存在
@RequestMapping(value = "/email")
public Boolean getByEmail(@RequestBody String email) {
String userId;
try {
User user = userDao.findByEmail(email);
userId = String.valueOf(user.getId());
LOGGER.info(user.toString());
LOGGER.info(userId);
}
catch (Exception ex) {
LOGGER.info("email does not exist");
return false;
}
LOGGER.info("Email does exist");
return true;
}
在AngularJs中,我这样做了:
(function () {
'use strict';
angular
.module('app')
.controller('RegisterController', RegisterController);
RegisterController.$inject = ['UserService', '$http' ];
function RegisterController(UserService, $http) {
var vm = this;
vm.register = register;
vm.error="This is a sample Error";
function register() {
testEmail();
console.log(vm.user)
console.log(("email must been verified before this"))
//if the testEmail returns false Create a user else give an error
// vm.dataLoading = true;
// UserService.Create(vm.user)
}
function testEmail(){
console.log("Check email")
console.log(vm.user.email)
console.log($http.post('/email',vm.user.email))
return $http.get('/email',vm.user.email)
}
}
})();
我基本上想做的是找到一种方法,使testEmail
函数返回true
或false
?
我建议像其中一个评论所说的那样研究异步验证器,但是如果你不喜欢这个选项,这里有一些更多的信息。
问题在于,由于testEmail函数发出异步ajax请求,因此调用之后的代码行将在ajax请求完成之前运行。您需要等待,直到请求完成。请看下面的例子:
function register() {
//test email returns a promise object, you need to wait until it is resolved, passing the response from the server to the callback
testEmail().then(function(response){
//replace this with the appropriate response
if(response.data.valid){
console.log(vm.user)
console.log(("email must been verified before this"))
//if the testEmail returns false Create a user else give an error
// vm.dataLoading = true;
// UserService.Create(vm.user)
}
});
}
下面是一个使用异步验证器的例子:
<标题> 形式<form name="form" ng-submit="!form.$pending && form.$valid && vm.register()">
<label>Email</label>
<input ng-model="vm.user.email" email-not-used ng-model-options="{ debounce: 500 }" type="text" name="email" />
<div ng-messages="form.email.$error">
<div ng-message="emailNotUsed">User with this email already exists.</div>
</div>
</form>
有几点需要注意:
-
!form.$pending && form.$valid && vm.register()
:这基本上确保您只能在表单有效且没有验证等待(因为异步验证)的情况下提交表单(使用vm.register()
注册用户)。 -
ng-model-options="{ debounce: 500 }
:这确保验证不会在每次按键时被调用,而是在最后一次按键后500毫秒,没有其他活动 -
email-not-used
是下一步 中定义的异步验证指令。 -
ngMessages
用于显示错误信息 - 理想情况下,您应该添加电子邮件格式验证,检查电子邮件是否为空等。为了使示例更简单,我省略了它们