Özel doğrulama için bir yönergem var (bir kullanıcı adı zaten mevcut değil). Doğrulama, kullanıcı adı mevcutsa sunucuya sormak için $ http hizmetini kullanır, böylece geri dönüş bir söz nesnesidir. Bu doğrulama için harika çalışıyor. Form geçersiz ve kullanıcı adı zaten alınmışsa myform. $ Error.usernameVerify değerini içerir. Ancak, user.username her zaman tanımsızdır, bu yüzden ng-model direktifimi kırıyor. Sanırım bu muhtemelen .success'daki işlevin kendi kapsamını oluşturması ve dönüş değerinin denetleyiciler $ kapsamı üzerinde kullanılmamasıdır. Bunu nasıl çözerim ng-model ciltleme hala çalışır? İşte AngularJS özel doğrulama yönergesinde async hizmetini arayın
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;
});
}
}
}
}
]);
benim şablon:
Ben eklemek için gerekli bu, işe almak için
<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>
görüyoruz. Http://blog.brunoscopelliti.com/form-validation-the-angularjs-way –
'a bakın. Bu yaklaşımdaki problem, checkForAvailable işlevinin (değer ile) hemen geri dönmesidir, çünkü userExists işlevleri bir söz vereceğinden Daha sonra yerine getirilmelidir. –