0

当页面首次加载和表单提交时,控制器两次触发 $scope 上定义的方法时出现问题。

这是小提琴:http: //jsfiddle.net/scabro/pQb6q/5/

<div data-ng-app="app" data-ng-controller="AppCtrl">

<form method="post" data-ng-submit="submitForm()">

    <span data-ng-show="showWarning('email')">Please provide valid email address</span>
    <input type="email" name="email" placeholder="Email address" data-ng-model="fields.email.value" />

    <span data-ng-show="showWarning('telephone')">Please provide your telephone number</span>
    <input type="text" name="telephone" placeholder="Telephone" data-ng-model="fields.telephone.value" />

    <span data-ng-show="showWarning('name')">Please provide your name</span>
    <input type="text" name="name" placeholder="Name" data-ng-model="fields.name.value" />

    <button type="submit">Submit</button>

</form>

</div>

这里有两个 AngularJs 模块——第一个带有控制器,另一个带有“isValid”工厂服务

 angular.module('app', ['validation'])

.controller('AppCtrl', function($scope, $log, isValid) {

    $scope.fields = {

        email : {
            type : 'email',
            value : '',
            required : true
        },
        telephone : {
            type : 'number',
            value : '',
            required : true
        },
        name : {
            type : 'string',
            value : '',
            required : true
        }

    };

    $scope.warnings = [];

    $scope.showWarning = function(field) {

        $log.info($scope.warnings);

        return ($scope.warnings.indexOf(field) !== -1);

    };


    $scope.submitForm = function() {

        $scope.warnings = [];

        isValid.run($scope.fields);

        if (isValid.errors.length > 0) {

            $scope.warnings = isValid.errors;

        }

    };

});


 angular.module('validation', [])

.factory('isValid', function() {

    return {

        errors : [],

        isEmail : function(emailValue) {

          return (
              emailValue.indexOf("@") != -1
          );

        },

        isNumber : function(numberValue) {

            return (
                !isNaN(parseFloat(numberValue)) &&
                isFinite(numberValue)
            );

        },

        isEmpty : function(emptyValue) {

            return (
                emptyValue === '' ||
                emptyValue === 'undefined'
            );

        },

        validateEmail : function(fieldObject, fieldName) {

            if (!this.isEmail(fieldObject.value)) {

                this.errors.push(fieldName);

            }

        },

        validateNumber : function(fieldObject, fieldName) {

            if (!this.isNumber(fieldObject.value)) {

                this.errors.push(fieldName);

            }

        },

        validateEmpty : function(fieldObject, fieldName) {

            if (this.isEmpty(fieldObject.value)) {

                this.errors.push(fieldName);

            }

        },

        type : function(fieldObject, fieldName) {

            switch(fieldObject.type) {

                case 'email':
                    if (fieldObject.required || !this.isEmpty(fieldObject.value)) {
                        this.validateEmail(fieldObject, fieldName);
                    }
                    break;

                case 'number':
                    if (fieldObject.required || !this.isEmpty(fieldObject.value)) {
                        this.validateNumber(fieldObject, fieldName);
                    }
                    break;

                default:
                    if (fieldObject.required) {
                        this.validateEmpty(fieldObject, fieldName);
                    }
                    break;

            }

        },

        resetErrors : function() {

            this.errors = [];

        },

        run : function(fields) {

            this.resetErrors();

            for (var fieldName in fields) {

                if (fields.hasOwnProperty(fieldName)) {

                    this.type(fields[fieldName], fieldName);

                }

            }

        }

    };

});

另外 - 由于某种原因,验证仅适用于前 2 个字段,并且似乎无法验证空字段。

这是页面首次加载(空数组)和首次提交表单时我在控制台中得到的内容:

在此处输入图像描述

在任何字段内键入时,它似乎也使用每个“keydown”事件调用 showWarning() 方法。

知道可能是什么原因造成的吗?

4

2 回答 2

1

validateEmpty!之前有一个假的this.isEmpty(...

至于为什么他们被调用两次,我猜当你提交时一个摘要循环正在运行,并且 Angular 正在检查它的手表以决定是否继续显示这些跨度,但我不完全确定它为什么这样做这个案例。

于 2014-03-27T18:28:02.743 回答
0

您没有使用角度标准验证。

这是一个非常粗鲁的电话自定义验证的示例

<div data-ng-app="app" data-ng-controller="AppCtrl">
  <form method="post" name="form" data-ng-submit="submitForm()">

    <input required="" type="email" name="email" placeholder="Email address" data-ng-model="fields.email.value" />
    <div data-ng-show="form.email.$dirty && form.email.$invalid">Please provide valid email address</div>
    <br />
    <input required="" valid-telephone type="text" name="telephone" placeholder="Telephone" data-ng-model="fields.telephone.value" />
    <div data-ng-show="form.telephone.$dirty && form.telephone.$invalid">Please provide your telephone number</div>
    <br />
    <input required="" type="text" name="name" placeholder="Name" data-ng-model="fields.name.value" />
    <div data-ng-show="form.name.$dirty && form.name.$invalid">Please provide your name</div>
    <br />
    <button type="submit">Submit</button>
  </form>
</div>

angular.module('app', [])

.controller('AppCtrl', function($scope, $log) {
    $scope.fields = {
        email : {
            value : ''
        },
        telephone : {
            value : ''
        },
        name : {
            value : ''
        }
    };
    $scope.submitForm = function() {

    };

})
.directive('validTelephone', [function() {
  return {
    require: 'ngModel',
    link: function(scope, ele, attrs, c) {
      scope.$watch(attrs.ngModel, function() {
          c.$setValidity('unique', /^\d{10}$/.test(c.$viewValue));
      });
    }
  };
}]);

input.ng-invalid {
  border: 1px solid red;
}

input.ng-valid {
  border: 1px solid green;
}

这是代码

http://plnkr.co/edit/Y9DzmBNlu9wNiJ1Odljc?p=preview

这是一些文档

http://scotch.io/tutorials/javascript/angularjs-form-validation

于 2014-03-28T07:11:33.867 回答