如何使用ng-messages显示Angularjs中的服务器错误

Leo*_*eon 24 javascript angularjs

我有我的角度应用程序验证注册表单.提交时,服务器也验证数据.我正在使用ng-messages以角度输出错误消息.

这是我的表单的缩短版本,到目前为止工作得很好.

<form name="signUpForm" novalidate data-ng-submit="attemptSignUp()">
    <label for="firstName">First name</label>
    <input type="email" name="email" id="email" required data-ng-model="data.user.email" />
    <div class="error" data-ng-messages="signUpForm.email.$error" data-ng-show="signUpForm.$submitted" data-ng-cloak>
        <p data-ng-message="required">Please provide your email</p>
    </div>
</form>
Run Code Online (Sandbox Code Playgroud)

服务器验证电子邮件地址是唯一的,如果不是,则返回422错误(来自Laravel 5),错误数组.

[
    'email' => 'This email is already in use'
]
Run Code Online (Sandbox Code Playgroud)

我想合并这个,以及从服务器发回其相关ng-messages块的任何其他消息.知道我怎么能完成它吗?

jor*_*are 27

一个简单的解决方案是拥有两个数组.一个用于客户端,另一个用于服务器端错误,这些错误填充在控制器中.如果存在客户端错误,则可以隐藏服务器端错误,或者避免双重消息.

我选择拥有两个数组而不是填充表单数组的原因是JavaScript控制器不应该知道或依赖于HTML的结构.HTML AngularJS模板应绑定到控制器,而不是对等.

<form name="signUpForm" novalidate data-ng-submit="attemptSignUp()">
    <label for="email">E-mail
        <input type="email" name="email" id="email" required data-ng-model="data.user.email" />
        <div class="error" data-ng-messages="signUpForm.email.$error" data-ng-show="signUpForm.$submitted" data-ng-cloak>
            <p data-ng-message="required">Please provide your email</p>
        </div>
        <div class="error" data-ng-messages="serverErrors" data-ng-show="signUpForm.$submitted" data-ng-cloak>
            <p data-ng-message="emailexists">Email already exists</p>
        </div>
    </label
</form>
Run Code Online (Sandbox Code Playgroud)

标签上的注释:使用屏幕阅读器的用户如果没有包装在标签内,则不会将错误消息大声朗读给他们.


小智 8

嗯,这不是最优雅的解决方案,因为你真的应该利用角度1.3.x中的asyncValidators然后创建自定义验证指令.

资源

http://plnkr.co/edit/s4jJAOqehBkFUC9osMsy?p=preview在帖子中找到了这个家伙.

可能在这里http://odetocode.com/blogs/scott/archive/2014/10/16/working-with-validators-and-messages-in-angularjs.aspx

当然还有文档

但请谨慎,因为这绝不是一个准备好使用的完整示例.它主要用于演示目的,并让您知道从哪里开始.我没有打扰清除以前的任何错误,重新验证表单或考虑其他验证错误.

迷死人

想象一下你的控制器看起来像这样

$scope.serverValidations = {};
$scope.attemptSignUp = function(){

    Api.validateEmail($scope.email).then(angular.noop, function(data){

      $scope.serverValidations = data
      for(prop in $scope.serverValidations){
          if($scope.signUpForm[prop]){
            angular.forEach($scope.serverValidations[prop],function(validation){
                $scope.signUpForm[prop].$setValidity(validation.type, false);
            });
          }
      }
    });
}
Run Code Online (Sandbox Code Playgroud)

并且包含验证错误的响应数据如下所示

{
  email:[
     {type:'unique', message:'This email is already in use'}
  ],
  name:[
     {type:'maxlength', message:'Your name is to long, get a new one :)'}
  ]
};
Run Code Online (Sandbox Code Playgroud)

然后在你的HTML中,你可以这样做

<div class="error" data-ng-messages="signUpForm.name.$error" data-ng-cloak="">
    <p data-ng-message="required">You don't have a name?</p>
    <p ng-repeat="validation in serverValidations['name']" ng-message="{{validation.type}}">{{validation.message}}</p>
</div>
Run Code Online (Sandbox Code Playgroud)

这里有一个脏的Codepen:http://codepen.io/anon/pen/yyzMgG?edit = 101 按下提交后,在2秒后(命中假服务器所需的时间),将显示您的服务器验证.

  • 在价值变化后,它无法正常工作 (2认同)

Art*_*yak 7

首先你应该设置validityerror messages

      $scope.formErrors = {};
      angular.forEach(errors, function(data, name) {
        if (!vm.register_form[name]) {
          return;
        }
        $scope.formErrors[name] = data.message;
        //this will set errors->server to invalid state
        $scope.register_form[name].$setValidity('server', false);
      });
Run Code Online (Sandbox Code Playgroud)

下一步将是渲染 ng-messages

      <div ng-messages="register_form.email.$error">
        <div ng-message="required">Email is required</div>
        <div ng-message="email">Invalid email</div>
        <div ng-message="server">{{formErrors.email}}</div>
      </div>
Run Code Online (Sandbox Code Playgroud)