Javascript 角度:$scope.$watch($attr.ngModel)仅在验证程序在指令中返回true时工作

Javascript 角度:$scope.$watch($attr.ngModel)仅在验证程序在指令中返回true时工作,javascript,angularjs,validation,Javascript,Angularjs,Validation,使用Angular的最新版本 当我设置自定义验证器并监控ngModel的更改时,我有一个指令$作用域。$watch仅在验证程序返回true时有效,而在它返回false时无效。我很好奇为什么会这样,还有什么选择 目标是,当满足正确的条件时,验证器应该将表单设置为有效。$scope.watch()用于在用户键入时进行额外的文本格式设置,例如,仅允许数字输入 app.directive('validatorDirective', [ function ($timeout) { return

使用Angular的最新版本

当我设置自定义验证器并监控ngModel的更改时,我有一个指令$作用域。$watch仅在验证程序返回true时有效,而在它返回false时无效。我很好奇为什么会这样,还有什么选择

目标是,当满足正确的条件时,验证器应该将表单设置为有效。$scope.watch()用于在用户键入时进行额外的文本格式设置,例如,仅允许数字输入

app.directive('validatorDirective', [
  function ($timeout) {
    return {
      restrict: 'A',
      require: 'ngModel',
      link: function ($scope, $element, $attr, $controller) {

        $scope.$watch($attr.ngModel, function (val) {
          // no output when validator returns false, but returns model updates when validator returns true
          console.log(val);
        });

        $controller.$validators.validFn = function (modelValue, viewValue) {
          return false;
        };
      }
    }
  }
}]);

在Angular
ng模型中,当验证失败时,值为
null
。我的假设是这导致了你的问题

在Angular 1.3中,他们添加了允许在模型上设置无效值的选项:

<input ng-model="my.value" ng-model-options="{allowInvalid: true}">


我认为可能发生的情况是,一旦模型失效,值就永远不会改变。即使您可以继续输入,模型值仍然为空,并且观察者不会触发。

这很有帮助,并回答了这个特定问题。事实证明,我真正想做的是只进行数字过滤,并在输入特定序列模式时验证true。正确的方法是使用$parser、$formatters和$validator。这也是一个很好的参考