show validation error messages on submit in angularjs

前端 未结 13 843
别那么骄傲
别那么骄傲 2020-11-28 02:25

I have a form which need to show validation error messages if clicked submit.

Here is a working plunker

 
13条回答
  •  眼角桃花
    2020-11-28 02:38

    Since I'm using Bootstrap 3, I use a directive: (see plunkr)

        var ValidSubmit = ['$parse', function ($parse) {
            return {
                compile: function compile(tElement, tAttrs, transclude) {
                    return {
                        post: function postLink(scope, element, iAttrs, controller) {
                            var form = element.controller('form');
                            form.$submitted = false;
                            var fn = $parse(iAttrs.validSubmit);
                            element.on('submit', function(event) {
                                scope.$apply(function() {
                                    element.addClass('ng-submitted');
                                    form.$submitted = true;
                                    if(form.$valid) {
                                        fn(scope, {$event:event});
                                    }
                                });
                            });
                            scope.$watch(function() { return form.$valid}, function(isValid) {
                                if(form.$submitted == false) return;
                                if(isValid) {
                                    element.removeClass('has-error').addClass('has-success');
                                } else {
                                    element.removeClass('has-success');
                                    element.addClass('has-error');
                                }
                            });
                        }
                    }
                }
            }
        }]
    
        app.directive('validSubmit', ValidSubmit);
    

    and then in my HTML:

    
      

    please enter your email

    please enter a valid email

    UPDATED

    In my latest project, I use Ionic so I have the following, which automatically puts .valid or .invalid on the input-item's:

    .directive('input', ['$timeout', function ($timeout) {
      function findParent(element, selector) {
        selector = selector || 'item';
        var parent = element.parent();
        while (parent && parent.length) {
          parent = angular.element(parent);
          if (parent.hasClass(selector)) {
            break;
          }
          parent = parent && parent.parent && parent.parent();
        }
        return parent;
      }
    
      return {
        restrict: 'E',
        require: ['?^ngModel', '^form'],
        priority: 1,
        link: function (scope, element, attrs, ctrls) {
          var ngModelCtrl = ctrls[0];
          var form = ctrls[1];
    
          if (!ngModelCtrl || form.$name !== 'form' || attrs.type === 'radio' || attrs.type === 'checkbox') {
            return;
          }
    
          function setValidClass() {
            var parent = findParent(element);
            if (parent && parent.toggleClass) {
              parent.addClass('validated');
              parent.toggleClass('valid', ngModelCtrl.$valid && (ngModelCtrl.$dirty || form.$submitted));
              parent.toggleClass('invalid', ngModelCtrl.$invalid && (ngModelCtrl.$dirty || form.$submitted));
              $timeout(angular.noop);
            }
          }
    
          scope.$watch(function () {
            return form.$submitted;
          }, function (b, a) {
            setValidClass();
          });
    
    
          var before = void 0;
          var update = function () {
            before = element.val().trim();
            ngModelCtrl.$setViewValue(before);
            ngModelCtrl.$render();
            setValidClass();
          };
          element
            .on('focus', function (e) {
              if (ngModelCtrl.$pristine) {
                element.removeClass('$blurred');
              }
    
            })
            .on('blur', function (e) {
              if (ngModelCtrl.$dirty) {
                setValidClass();
                element.addClass('$blurred');
              }
            }).on('change', function (e) {
              if (form.$submitted || element.hasClass('$blurred')) {
                setValidClass();
              }
            }).on('paste', function (e) {
              if (form.$submitted || element.hasClass('$blurred')) {
                setValidClass();
              }
            })
          ;
    
        }
      };
    }])
    

    and then in the HTML:

        

    and in the controller:

      self.signin = function (form, data) {
        if (!form.$valid) return;
    
        Authentication.emailLogin(data)
        //...
    

    so, now, in the CSS, you can do stuff like:

    .item.valid::before{
        float: right;
        font-family: "Ionicons";
        font-style: normal;
        font-weight: normal;
        font-variant: normal;
        text-transform: none;
        text-rendering: auto;
        line-height: 1;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        color: #66cc33;
        margin-right: 8px;
        font-size: 24px;
        content: "\f122";
    }
    
    .item.invalid::before{
        float: right;
        font-family: "Ionicons";
        font-style: normal;
        font-weight: normal;
        font-variant: normal;
        text-transform: none;
        text-rendering: auto;
        line-height: 1;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        color: #ef4e3a;
        margin-right: 8px;
        font-size: 24px;
        content: "\f12a";
    
    /*
        border-left: solid 2px #ef4e3a !important;
        border-right: solid 2px #ef4e3a !important;
    */
    }
    

    MUCH SIMPLER!

提交回复
热议问题