gpt4 book ai didi

angularjs - 在 AngularJS 自定义验证指令中调用异步服务

转载 作者:行者123 更新时间:2023-12-04 05:06:52 25 4
gpt4 key购买 nike

我有一个自定义验证指令(验证用户名不存在)。验证使用 $http 服务询问服务器用户名是否存在,因此返回的是一个 promise 对象。这对于验证非常有用。该表单无效,并且在用户名已被使用时包含 myform.$error.usernameVerify。但是, user.username 始终未定义,因此它破坏了我的 ng-model 指令。我认为这可能是因为 .success 中的函数正在创建它自己的范围,并且 Controller $scope 上没有使用返回值。我该如何解决这个问题,以便 ng-model 绑定(bind)仍然有效?

commonModule.directive("usernameVerify", [
'userSvc', function(userSvc) {
return {
require: 'ngModel',
scope: false,
link: function(scope, element, attrs, ctrl) {
ctrl.$parsers.unshift(checkForAvailability);
ctrl.$formatters.unshift(checkForAvailability);

function checkForAvailability(value) {
if (value.length < 5) {
return value;
}
// the userSvc.userExists function is just a call to a rest api using $http
userSvc.userExists(value)
.success(function(alreadyUsed) {
var valid = alreadyUsed === 'false';
if (valid) {
ctrl.$setValidity('usernameVerify', true);
return value;
}
ctrl.$setValidity('usernameVerify', false);
return undefined;
});
}
}
}
}
]);

这是我的模板:
<div class="form-group" ng-class="{'has-error': accountForm.username.$dirty && accountForm.username.$invalid}">
<label class=" col-md-3 control-label">Username:</label>
<div class="col-md-9">
<input name="username"
type="text"
class="form-control"
ng-model="user.username"
ng-disabled="user.id"
ng-minlength=5
username-verify
required />
<span class="field-validation-error" ng-show="accountForm.username.$dirty && accountForm.username.$error.required">Username is required.</span>
<span class="field-validation-error" ng-show="accountForm.username.$dirty && accountForm.username.$error.minlength">Username must be at least 5 characters.</span>
<span class="field-validation-error" ng-show="accountForm.username.$dirty && accountForm.username.$error.usernameVerify">Username already taken.</span>
</div>
</div>

最佳答案

对于这种情况,Angular 有一个专用的 $asyncValidators 数组:

https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) {
var value = modelValue || viewValue;

// Lookup user by username
return $http.get({url:'/api/users/' + value}).
then(function resolved() {
//username exists, this means validation fails
return $q.reject('exists');
}, function rejected() {
//username does not exist, therefore this validation passes
return true;
});
};

关于angularjs - 在 AngularJS 自定义验证指令中调用异步服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24272416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com