2017-07-14 186 views
-1

我试图通过使用自定义指令来实现异步验证。AngularJS - 插入自定义指令后,表单变为无效

这是指令

moduloArea.directive('uniqueName', function($http, $q) { 
    return { 
     require : 'ngModel', 
     link: function($scope, element, attrs, ngModel) { 
      ngModel.$asyncValidators.nombre = function(modelValue, viewValue) { 
       return $http.get('/checkUsernameAvailability/'+viewValue).then(
        function(response) { 
         if (!response.data.validUsername) { 
          return $q.reject(response.data.errorMessage); 
         } 
         return true; 
        } 
       ); 
      }; 
     } 
    }; 
}); 

结果在控制台

console result when the username is typed

正如你可以看到当用户名输入的回报的JSON对象,因为此用户名已经拿了。

但是,在插入伪指令unique-name时,HTML格式为$ invalid。

<form name="registerUsernameForm" novalidate="novalidate"> 
    <input type="text" name="username" data-ng-model="person.userName" data-unique-name="" required="required"/> 
    <span data-ng-show="registerUsernameForm.username.$error.uniqueName">This username is already taken.</span>   
    <button type="submit" data-ng-disabled="registerUsernameForm.$invalid || registerUsernameForm.$pending" data-ng-click="registerPerson(person)"> Save Person </button> 
</form> 

我使用的数据唯一的名称=“”(=“”),因为如果我不那么thymeleaf生成以下错误:

Attribute name "data-unique-name" associated with an element type "input" must be followed by the ' = ' character.

你这是什么认为可能是错误的?

回答

1

您正在验证nombre不是uniqueName。出于这个原因,uniqueName仍然保持无效。

moduloArea.directive('uniqueName', function($http, $q) { 
    return { 
     require : 'ngModel', 
     link: function($scope, element, attrs, ngModel) { 
      ngModel.$asyncValidators.uniqueName= function(modelValue, viewValue) { 
       var value = modelValue || viewValue; 
       return $http.get('/checkUsernameAvailability/'+value).then(
        function resolved(response) { 
         if (response.data && !response.data.validUsername) { 
          return $q.reject(response.data.errorMessage); 
         } 
         return true; 
        }, function rejected() { 
         //username does not exist, therefore this validation passes 
         return true; 
} 
       ); 
      }; 
     } 
    }; 
}); 
+0

感谢的人,像我8.我真的有这种小白,我从失去你能解释一下这个指令对我“功能解决(响应)”开始。 – wilson

+1

已解决仅仅是清除代码的名称。你可以设置你想要的。 $ http promise基本上有2个回调。首先是成功,第二个可以看到一个错误。当休息API返回2XX状态,这意味着它是成功的。 4XX是客户端错误,5XX是服务器错误。即,如果名称不存在,则可以抛出错误。这意味着验证成功。 –