【问题标题】:Angular: $scope.$watch($attr.ngModel) only working when validator returns true in directiveAngular:$scope.$watch($attr.ngModel) 仅在验证器在指令中返回 true 时工作
【发布时间】:2015-06-02 02:35:15
【问题描述】:

使用最新版本的 Angular。

当我设置自定义验证器并监视 ngModel 的更改时,我有一个指令。 $scope.$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;
        };
      }
    }
  }
}]);

【问题讨论】:

    标签: javascript angularjs validation


    【解决方案1】:

    当验证失败时,Angular ng-model 的值是 null。我的假设是这会导致您的问题。

    在 Angular 1.3 中,他们添加了 ng-model-options 以允许在模型上设置无效值:

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

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

    【讨论】:

    • 这很有帮助并回答了那个具体问题。事实证明,我真正想做的是仅进行数字过滤并在输入特定序列模式时验证为真。正确的方法是使用 $parsers、$formatters 和 $validators。这也是一个很好的参考stackoverflow.com/questions/14419651/…
    猜你喜欢
    • 2015-08-31
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多