Reconcile Angular.js and Bootstrap form validation styling

前端 未结 12 2060
刺人心
刺人心 2020-12-22 18:53

I am using Angular with Bootstrap. Here is the code for reference:

12条回答
  •  鱼传尺愫
    2020-12-22 19:32

    My improvement to Jason Im's answer the following adds two new directives show-validation-errors and show-validation-error.

    'use strict';
    (function() {
    
        function getParentFormName(element,$log) {
            var parentForm = element.parents('form:first');
            var parentFormName = parentForm.attr('name');
    
            if(!parentFormName){
                $log.error("Form name not specified!");
                return;
            }
    
            return parentFormName;
        }
    
        angular.module('directives').directive('showValidation', function () {
            return {
                restrict: 'A',
                require: 'form',
                link: function ($scope, element) {
                    element.find('.form-group').each(function () {
                        var formGroup = $(this);
                        var inputs = formGroup.find('input[ng-model],textarea[ng-model],select[ng-model]');
    
                        if (inputs.length > 0) {
                            inputs.each(function () {
                                var input = $(this);
                                $scope.$watch(function () {
                                    return input.hasClass('ng-invalid') && !input.hasClass('ng-pristine');
                                }, function (isInvalid) {
                                    formGroup.toggleClass('has-error', isInvalid);
                                });
                                $scope.$watch(function () {
                                    return input.hasClass('ng-valid') && !input.hasClass('ng-pristine');
                                }, function (isInvalid) {
                                    formGroup.toggleClass('has-success', isInvalid);
                                });
                            });
                        }
                    });
                }
            };
        });
    
        angular.module('directives').directive('showValidationErrors', function ($log) {
            return {
                restrict: 'A',
                link: function ($scope, element, attrs) {
                    var parentFormName = getParentFormName(element,$log);
                    var inputName = attrs['showValidationErrors'];
                    element.addClass('ng-hide');
    
                    if(!inputName){
                        $log.error("input name not specified!")
                        return;
                    }
    
                    $scope.$watch(function () {
                        return !($scope[parentFormName][inputName].$dirty && $scope[parentFormName][inputName].$invalid);
                    },function(noErrors){
                        element.toggleClass('ng-hide',noErrors);
                    });
    
                }
            };
        });
    
        angular.module('friport').directive('showValidationError', function ($log) {
            return {
                restrict: 'A',
                link: function ($scope, element, attrs) {
                    var parentFormName = getParentFormName(element,$log);
                    var parentContainer = element.parents('*[show-validation-errors]:first');
                    var inputName = parentContainer.attr('show-validation-errors');
                    var type = attrs['showValidationError'];
    
                    element.addClass('ng-hide');
    
                    if(!inputName){
                        $log.error("Could not find parent show-validation-errors!");
                        return;
                    }
    
                    if(!type){
                        $log.error("Could not find validation error type!");
                        return;
                    }
    
                    $scope.$watch(function () {
                        return !$scope[parentFormName][inputName].$error[type];
                    },function(noErrors){
                        element.toggleClass('ng-hide',noErrors);
                    });
    
                }
            };
        });
    
    })();
    

    The show-validation-errors can be added to a container of errors so that it will show/hide the container based upon a form fields validity.

    and the show-validation-error shows or hides an element based upon that form fields validity on a given type.

    An example of intended use:

            
                
    Organization number is required.
    Organization number needs to have the following format "000 000 000" or "000000000".

提交回复
热议问题