2014-06-17 41 views
8

Ö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> 

cevap

4

"dönüş değeri;" Eşzamansız çağrının dışında. Aşağıdaki kod.

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; 
        } 
        userSvc.userExists(value) 
         .success(function(alreadyUsed) { 
          var valid = alreadyUsed === 'false'; 
          if (valid) { 
           ctrl.$setValidity('usernameVerify', true); 
           return value; 
          } 
          ctrl.$setValidity('usernameVerify', false); 
          return undefined; 
         }); 
        // Below is the added line of code. 
        return value; 
       } 
      } 
     } 
    } 
]); 
+1

görüyoruz. Http://blog.brunoscopelliti.com/form-validation-the-angularjs-way –

+0

'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. –

16

Eğik tam da bu durum için $ asyncValidators bir adanmış bir dizi vardır:

Bu yanlıştır 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; 
    }); 
}; 
+6

Not: Bu, Açısal 1.3.0'dan beri kullanılabilir –