【问题标题】:How to add error into form validation error list in angular?如何将错误添加到角度的表单验证错误列表中?
【发布时间】:2016-10-03 11:55:23
【问题描述】:

我正在使用ng-messages 来验证我的注册表单字段,但是我有一个问题,我无法检查是否使用了用户名,直到我向服务器发送注册请求。目前我有这种类型的代码:

UserPool.signUp(vm.form.username, vm.form.password, attributes)
    .then(function (result) {
        $state.go('app.pages_auth_confirm', {
            user: result.user
        });
    })
    .catch(function () {
        $scope.registerForm.username.$invalid = true;
        $scope.registerForm.username.$error.usernameAlreadyExists = true;
    });

和 HTML:

<input name="username" ng-model="vm.form.username" placeholder="Name" required>
<div ng-messages="registerForm.username.$error" role="alert">
    <div ng-message="required">
        <span>Username field is required</span>
    </div>
    <div ng-message="usernameAlreadyExists">
        <span>User with this username already exists</span>
    </div>
</div>

这可行,但我想知道实现该功能的正确方法。注册表单还有许多其他字段,手动更改其中一些字段以显示错误似乎不是一个好主意。我还对角度验证和消息进行了一些研究,发现了自定义验证和$asyncValidators,但我也不能使用该功能,因为据我了解,我需要某种 API 来获取有关使用的用户名的信息,但我没有那种可能性,正如我已经说过的,在我发送注册请求之前,我无法检查是否使用了用户名。那么有人可以告诉我该怎么做吗?使用这种验证的正确方法是什么?

【问题讨论】:

    标签: javascript angularjs validation ng-messages


    【解决方案1】:

    为了在angular way 中实现此目的,请在user-name input 中创建Directive 以检查unique validation,并创建factory 以进行api 调用以检查用户名验证。

    <input name="username" ng-model="vm.form.username" placeholder="Name" required name="username" unique> 
    
    <div ng-messages="registerForm.username.$error" role="alert">
        <div ng-message="required">
            <span>Username field is required</span>
        </div>
        <div ng-message="unique">
            <span>User with this username already exists</span>
        </div>
    </div>
    

    directive 可以是这样的,

    在这个指令中,我们注入了一个名为 usernameservice 的工厂,它返回承诺 true 或 false。

    myApp.directive('unique', function(usernameservice) {
      return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, element, attrs, ngModel) {
          ngModel.$asyncValidators.unique = usernameservice;
        }
      };
    });
    

    这里是factory,您的 api 调用所在。

    myApp.factory('usernameservice', function($q, $http) {
      return function(username) {
        var deferred = $q.defer();
    
        // your api vall goes her
        $http.get('/api/users/' + username).then(function() { // 
          // Found the user, therefore not unique.
          deferred.reject();
        }, function() {
          // User not found, therefore unique!
          deferred.resolve();
        });
    
        return deferred.promise;
      }
    });
    

    现在每次更改值都会显示消息,让我们延迟检查,以便如果用户输入更多字母,它会被调用,让我们使用 ng-model-option debounce 为它。

    <input name="username" ng-model="vm.form.username" placeholder="Name" required name="username" unique ng-model-options="{ debounce: 100 }">  
    

    【讨论】:

    • 除非我发送包含所有字段(用户名、密码、电子邮件、电话等)的注册请求,否则无法知道用户名是否有效,并且据我所知,这种解决方案不会工作,知道用户名是否有效的唯一方法是在用户按下注册按钮之后,我将收到包含状态 400 和错误消息“用户名已被占用!”的响应。这是我知道用户名已被使用的唯一方法。
    • 好的,但您不想像示例中那样将异步验证添加到控制器中的表单?
    • 您是否在注册时收到错误字段名称,例如用户名已被占用,此类消息?
    • 我的想法是,只将用户名参数发送到注册请求,因为其余字段无论如何都不会填写,如果用户名已经注册,你总是会收到错误,然后你可以最后提交所有字段
    • 检查官方角度文档中给出的自定义验证,它也提到了相同的方法。 form validation
    【解决方案2】:

    这种代码仅用于将验证错误添加到数组中:

    $scope.registerForm.username.$setValidity("usernameAlreadyExists", false);
    

    这应该像这样在 catch 块中调用:

    ...
    .catch(function () {
        $scope.registerForm.username.$setValidity("usernameAlreadyExists", false);
    });
    

    此代码不会手动标记任何表单变量,而是使用接口方法$setValidity 根据需要设置每个必要的变量。

    【讨论】:

      【解决方案3】:

      在您的 html 中,将您的表单放入

      <ng-form name="myFormName">
          ... your form...
      </ng-form>
      

      这个标签是一个角形的&lt;form&gt;&lt;/form&gt;。如果需要,您可以在 &lt;ng-form&gt; 等中添加一些 &lt;ng-form&gt;

      然后,在你的 html 组件上放一个验证器,比如“required”:

      <ng-form name="myFormName">
          <input type="text" name="myinput" ng-required="true">
      </ng-form>
      

      这里,如果“无效”类是无效的,即不填写我们的案例,则会在组件上放置一个“无效”类。

      然后您可以为“无效”类自定义组件。

      如果你想检查所有的表单错误,你可以显示 $error 变量。在我们的示例中,您可以打印 myFormName.$error 并使用 myFormName.$validmyFormName.$invalid 检查状态

      【讨论】:

      • 嗯...当我回答您的初稿时,我想我误解了您的最后一句话...所以,您根本无法更改 HTML 方面?
      • 我可以更改不是该问题重点的 HTML。我对 html 没有任何问题。我只是不喜欢手动标记任何东西。甚至 registerForm.username.$invalidtrue 也不行。我将编辑问题并添加 HTML。我认为这是个好主意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 2019-08-14
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多