Angularjs初始表单验证与指令

Gra*_*amB 10 javascript angularjs

我有一个调用的验证指令valid-number,用于使用$ setValidity设置表单的有效性 - 这适用于我在输入框中键入的指令作为属性应用的任何文本值.

HTML是

<form name="numberForm">
<input name="amount" type="text" ng-model="amount" required  valid-number /></form>
Run Code Online (Sandbox Code Playgroud)

该指令如下

angular.module('test',[]).directive('validNumber',function(){
            return{
                require: "ngModel",
                link: function(scope, elm, attrs, ctrl){

                    var regex=/\d/;
                    ctrl.$parsers.unshift(function(viewValue){
                        var floatValue = parseFloat(viewValue);

                        if(regex.test(viewValue)){
                            ctrl.$setValidity('validNumber',true);
                        }
                        else{
                            ctrl.$setValidity('validNumber',false);
                        }
                        return viewValue;
                    });
                }
            };
        });
Run Code Online (Sandbox Code Playgroud)

但是,我还希望触发验证并将css设置为无效的clss,如果输入框初始化为首次加载页面时的值无效,例如,如果我设置$scope.amount = 'not a number'我希望输入框有指令适用于它,但没有快乐.为了not a number突出显示为无效,我必须更改输入的内容,从而触发指令.

如何确保该指令适用于<input> 初始化的任何内容?

这里有一个完整的代码示例;

http://jsfiddle.net/JW43C/5/

Ste*_*wie 16

$parsersarray包含将应用于模型从视图接收的值的函数列表(用户键入的内容),并且$formatters数组包含在视图中显示之前应用于模型值的函数列表.

在您的指令中,您正确使用了$parsers数组,但$formatters如果要验证初始值,还需要添加数组:

angular.module('test',[]).directive('validNumber',function(){
  return{
    require: "ngModel",
    link: function(scope, elm, attrs, ctrl){
      var regex = /^\d$/;
      var validator = function(value){
        ctrl.$setValidity('validNumber', regex.test(value));
        return value;
      };

      ctrl.$parsers.unshift(validator);
      ctrl.$formatters.unshift(validator);
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

演示人员