【问题标题】:How to force validation to run on model when other model changes?当其他模型发生变化时,如何强制验证在模型上运行?
【发布时间】:2015-03-25 15:32:15
【问题描述】:

我有一个输入字段,上面注册了多个$validators,用于更新模型。 其中一些验证器会与范围内的其他值进行比较(这些值也使用输入字段进行更新)。

当依赖的其他值发生更改时,如何强制 AngularJS 再次运行这些验证?

我尝试在文档中找到与此相关的任何内容,并在依赖字段上创建了一个 $watch 并将模型值设置为自身(希望它会强制重新验证),但在这两个方面都没有运气。

【问题讨论】:

标签: javascript angularjs validation


【解决方案1】:

如果您使用的是 Angularjs 1.3+,您可以使用 $validate 方法。 假设您的输入“A”是依赖于其他输入的输入,我们称它们为“B”。 您可以向每个 B 的 $viewChangeListeners 添加一个函数,该函数只会调用 A 的 $validate 方法。这将产生以下效果;每次修改 B 输入之一时,您的 A 输入 $validators 都会运行。

【讨论】:

  • 正是我需要的。谢谢! $scope.myForm.inputB.$viewChangeListeners.push(function() { $scope.myForm.inputA.$validate(); });我会写一个指令来重用,但是这个概念已经被证明了。
【解决方案2】:

我知道这在不久前就得到了回答,但我遇到了类似的问题,我设法从一堆其他答案和一些试验和错误中拼凑出一个合适的解决方案。我想有一天其他人可能会寻找类似的东西......

这是一种(据我所知)直接与验证系统相关的方法。这个特定示例创建了一个match 验证规则,它比较两个模型并验证它们的值是否相同。

<script type="text/javascript">
angular.module( "YourModule", [] )
    .directive( "match", function() {
        return {
            require: 'ngModel',
            restrict: 'A',
            link: function( $scope, $elem, $attrs, $ctrl ) {

                // targetModel is the name of the model you want to
                // compare against.
                var targetModel = $attrs.match;

                // Add the 'match' validation method
                $ctrl.$validators.match = function( modelValue, viewValue ) {
                    valid = $scope.$eval( targetModel ) == viewValue;
                    $ctrl.$setValidity( 'match', valid );   
                    return valid ? viewValue : undefined;
                };

                // When the target model's value changes, cause this model
                // to revalidate
                $scope.$watch( targetModel, function() {
                    $ctrl.$validate();
                } );

            }
        };
    } );

然后这样使用(显然包括一个表格,ng-appng-controller):

<input type="password" ng-model="password" />
<input type="password" ng-model="confirmation" match="password" />

一般的想法是,当匹配指令被处理时,一个额外的函数(match)被添加到$ctrl对象上的$validators,这是其他验证器(必填字段,最小长度,. ..) 似乎还活着。这会在字段上设置验证,但该规则仅在具有匹配指令的字段更新时才会处理。

为了解决这个问题,然后在目标模型上设置了一个手表。当目标模型的值更新时,它将在原始控件上运行$validate() 方法,允许在两个字段中的任何一个字段中进行验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2020-11-29
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多