当前位置: 首页 > 知识库问答 >
问题:

用于显示输入错误的AngularJS表单验证指令

沈国安
2023-03-14

我需要创建一个验证指令来自动显示每个输入的所有输入错误。此验证指令应该显示当前时刻的所有错误,错误列表应该在用户键入时自动更新。

var app = angular.module('app', []);

app.controller('appCtrl', function ($scope) {

});

app.directive('validate', function () {
    return {
        restrict: 'A',
        require: 'ngModel', // require:  '^form',

        link: function (scope, element, attrs, ctrl) {
            console.log('======================');
            console.log(scope);
            console.log(element);
            console.log(attrs);
            console.log(ctrl);
            console.log(scope.form.$error);
            angular.forEach(scope.form.$error, function (value, key) {
                console.log('scope.form.$error = ' + key + ': ' + value);
                console.log(value);
            });

        }
    };
});


app.directive('positiveInteger', function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attrs, ctrl) {
            ctrl.$parsers.unshift(function (viewValue) {
                var INTEGER_REGEXP = /^\d+$/;
                if (INTEGER_REGEXP.test(viewValue)) { // it is valid
                    ctrl.$setValidity('positiveInteger', true);
                    return viewValue;
                } else { // it is invalid, return undefined (no model update)
                    ctrl.$setValidity('positiveInteger', false);
                    return undefined;
                }
            });
        }
    };
});


app.directive('positiveFloat', function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attrs, ctrl) {
            ctrl.$parsers.unshift(function (viewValue) {
                var FLOAT_REGEXP = /^(?:[1-9]\d*|0)?(?:\.\d+)?$/;
                if (FLOAT_REGEXP.test(viewValue)) { // it is valid
                    ctrl.$setValidity('positiveInteger', true);
                    return viewValue;
                } else { // it is invalid, return undefined (no model update)
                    ctrl.$setValidity('positiveInteger', false);
                    return undefined;
                }
            });
        }
    };
});


app.directive('minModel', function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attrs, ctrl) {
            ctrl.$parsers.unshift(function (viewValue) {
                if (viewValue > scope[attrs.minModel]) { // it is valid
                    ctrl.$setValidity('minModel', true);
                    return viewValue;
                } else { // it is invalid, return undefined (no model update)
                    ctrl.$setValidity('minModel', false);
                    return undefined;
                }
            });

        }
    };
});

链接到JSFiddle,带有一些用于测试的代码。

附言。UI-UTIL也有类似的功能,但它们的指令不能在一个地方设置类似的错误消息。

共有1个答案

公西承
2023-03-14

我想建议看看这篇文章,在这篇文章中作者正在解释如何实现你的目标,你可以深入研究代码。链接

此帖子中显示错误消息的示例

module = angular.module('app', []);

module.directive('showErrors', function($timeout) {
    return {
      restrict: 'A',
      require: '^form',
      link: function (scope, el, attrs, formCtrl) {
        // find the text box element, which has the 'name' attribute
        var inputEl   = el[0].querySelector("[name]");
        // convert the native text box element to an angular element
        var inputNgEl = angular.element(inputEl);
        // get the name on the text box
        var inputName = inputNgEl.attr('name');

        // only apply the has-error class after the user leaves the text box
        var blurred = false;
        inputNgEl.bind('blur', function() {
          blurred = true;
          el.toggleClass('has-error', formCtrl[inputName].$invalid);
        });

        scope.$watch(function() {
          return formCtrl[inputName].$invalid
        }, function(invalid) {
          // we only want to toggle the has-error class after the blur
          // event or if the control becomes valid
          if (!blurred && invalid) { return }
          el.toggleClass('has-error', invalid);
        });

        scope.$on('show-errors-check-validity', function() {
          el.toggleClass('has-error', formCtrl[inputName].$invalid);
        });

        scope.$on('show-errors-reset', function() {
          $timeout(function() {
            el.removeClass('has-error');
          }, 0, false);
        });
      }
    }
  });

module.controller('NewUserController', function($scope) {
  $scope.save = function() {
    $scope.$broadcast('show-errors-check-validity');

    if ($scope.userForm.$valid) {
      alert('User saved');
      $scope.reset();
    }
  };

  $scope.reset = function() {
    $scope.$broadcast('show-errors-reset');
    $scope.user = { name: '', email: '' };
  }
});
 类似资料:
  • 问题内容: 我在AngularJS应用程序中创建了一个指令,该指令在我的应用程序中生成样式输入。看起来像这样: 它的模板是: 调用很简单: 我想为此字段创建验证,并添加了错误信息: 而showError是: 基本上,它是从《用AngularJS掌握Web应用程序开发》一书中复制的。我有一个问题,因为当我在控制台中登录表单时,我的名字是,而不是name属性,这里的值应该是“ name”。我究竟做错了

  • 所以我想尝试在登录页面上显示“无效用户名或密码”的错误信息,每当用户得到他们是错误的。 到目前为止,我只是将它记录在控制台中,在那里我看到错误:“auth/invalce-email”,其消息属性是:“电子邮件地址格式化得很糟糕。”当输入错误的电子邮件时(密码也是如此)。有什么方法可以在我的singin组件的html中的ngIf div元素中显示这些(或者更确切地说是自定义消息“无效的用户名或密码

  • 问题内容: 例如,我有要显示表单输入错误的表单。 如果有一些错误,我需要在输入标签附近显示红色徽章(带有“悬停显示错误”)。如果用户将鼠标悬停在红色徽章上,他将使用AngularJS UI Bootstrap工具提示 查看错误列表。我不想将错误列表放到tooltip-html-unsafe属性中,因为它不方便编辑和维护。 此代码更具声明性: 比这段代码: 如何使用AngularJS UI Boot

  • 有一张Zend登记表。输入用户名、电子邮件、密码和确认密码。电子邮件验证程序如下所示: 有4个验证器:必需类型、电子邮件格式以及数据库中是否有人具有以下电子邮件。错误消息如下:-需要电子邮件-电子邮件地址格式无效-电子邮件地址已存在 尝试使用ajax捕获错误消息和输出时出现问题。在具有以下功能的RegisterController中: 和jQuery文件: 在控制台我得到了这样的东西https:/

  • 开发Web的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要,我们经常会在微博、新闻中听到某某网站被入侵了,存在什么漏洞,这些大多是因为网站对于用户输入的信息没有做严格的验证引起的,所以为了编写出安全可靠的Web程序,验证表单输入的意义重大。 我们平常编写Web应用主要有两方面的数据验证,一个是在页面端的js验证(目前在这方面有很多的插件库,比如Validati

  • 主要内容:输入验证,应用代码,实例解析AngularJS 表单和控件可以验证输入的数据。 输入验证 在前面的几个章节中,你已经学到关于 AngularJS 表单和控件的知识。 AngularJS 表单和控件可以提供验证功能,并对用户输入的非法数据进行警告。 客户端的验证不能确保用户输入数据的安全,所以服务端的数据验证也是必须的。 应用代码 < !DOCTYPE html > < html > < script src= "http:/