form-validation-as-you-type のディレクティブを使用しています。ユーザー名フィールドが変更されるたびに、http 要求が行われます。リクエストが発生したことをコンソールで確認できますが、フィールドでぼかしイベントが発生するまで、ビューは「固有の」エラー メッセージで更新されません。
ただし、ユーザー名が重複したものから一意のものに変更されるとすぐに、エラー メッセージはすぐに消えます。この方向にはぼかしは必要なく (エラー メッセージを非表示)、もう一方の方向にのみぼかします (エラー メッセージを表示)...
何故ですか?
=======指令=========
myDirs.directive('ensureUnique', ['$http', function($http) {
return {
require: 'ngModel',
link: function(scope, ele, attrs, c) { if (scope.registered) {return true};
scope.$watch(attrs.ngModel, function() {
$http({
method: 'GET',
url: 'http://webservice.buddyplatform.com/v1/UserAccount_Profile_CheckUserName',
params: {
UserNameToVerify: ele.val(),
BuddyApplicationName:'xxx',
BuddyApplicationPassword:'yyy'
}
}).success(function(data, status, headers, cfg) {
c.$setValidity('unique', (data==='UserNameAvailble'));
}).error(function(data, status, headers, cfg) {
c.$setValidity('unique', false);
});
});
}
}
}]);
=========== HTML ================
<label>Username:</label>
<input name="username" type="text" ng-model="form.username"
ng-minlength=5 ng-maxlength=20 ensure-unique="username" required/>
<div class="error" ng-show="myForm.username.$dirty && myForm.username.$invalid">
<small class="error" ng-show="myForm.username.$error.required">Please input a username</small>
<small class="error" ng-show="myForm.username.$error.minlength">Your username is required to be at least 5 characters</small>
<small class="error" ng-show="myForm.username.$error.maxlength">Your username cannot be longer than 20 characters</small>
<small class="error" ng-show="myForm.username.$error.unique">That username is taken, please try another</small>
</div>