【问题标题】:Circular number validation in AngularJSAngularJS 中的循环数字验证
【发布时间】:2015-03-25 16:04:54
【问题描述】:

我目前正在处理一个似乎很常见的问题,但我很难找到一种优雅的方式来处理它。问题归结为两个数字输入字段,其中一个字段必须小于另一个字段。为此,我使用以下指令来验证低输入字段的输入,其中 scope.maxThreshold 是高输入字段的输入:

testDirectives.directive('maxThreshold', function() {
    return {
        require: 'ngModel',
        link: function(scope, elm, attrs, ctrl) {
            ctrl.$parsers.unshift(function(viewValue) {
                if (viewValue > scope.maxThreshold) {
                    ctrl.$setValidity('thresholdTooHigh', false);
                    return undefined;
                } else {
                    ctrl.$setValidity('thresholdTooHigh', true);
                    return viewValue;
                }
            });
        }
    };
});

较高输入字段的指令与比较切换非常相似。这一切都很好,直到用户在收到验证错误后切换他们正在输入的字段。例如,如果较低字段为 5,较高字段为 10,并且用户将较低字段切换为 15。此字段现在被标记为存在验证错误。现在,如果用户转到更高的输入字段并输入 20,则该字段的指令将触发并且验证通过。问题是下方输入字段的有效性仍然被标记为无效。处理此问题并将较低输入字段从用于较高输入字段的指令标记为有效的最佳方法是什么?谢谢。

【问题讨论】:

标签: javascript angularjs forms validation


【解决方案1】:

似乎问题在于检查事件输入的有效性,而不是模型更改。即,如果条件发生变化,您还想检查有效性。见指令:

这更接近您正在寻找的内容。如果正在编辑最小字段,您似乎不知道如何使最大字段无效。在 watch 函数中的另一个检查可以完成。

    .directive('highThreshold', function() {
    return {
        require: 'ngModel',
        scope: {
            'highThreshold': '='
        },
        link: function($scope, element, ctrl, ngModel) {
            $scope.$watch('highThreshold', function(){
                var isValid = ngModel.$modelValue < $scope.highThreshold;
                ngModel.$setValidity("highThreshold", isValid);
            });
            ngModel.$validators.highThreshold = function(value) {
                return value < $scope.highThreshold;
            };
        }
    };

})
.directive('lowThreshold', function() {

    return {
        require: 'ngModel',
        scope: {
            'lowThreshold': '='
        },
        link: function($scope, element, attrs, ngModel) {
            $scope.$watch('lowThreshold', function(){
                var isValid = ngModel.$modelValue > $scope.lowThreshold;
                ngModel.$setValidity("lowThreshold", isValid);
            });
            ngModel.$validators.lowThreshold = function(value) {
                return value > $scope.lowThreshold;
            };
        }
    };

});

http://jsfiddle.net/dn9prtxx/

很抱歉第一次没有收到问题 :) 希望这会有所帮助!

【讨论】:

  • 这没有帮助。我正在寻找两个字段都可能无效的示例。最大值字段的有效性不依赖于其他输入字段。
  • 如果您的问题是“问题归结为两个数字输入字段,其中一个字段必须小于另一个字段”。最大字段在什么情况下会失效?
  • 我想我现在正在关注你。根据其他字段的值,您正在使用的当前字段输入被修改为无效。我不明白为什么这是必要的,因为您输入的顺序应该阐明最大值。但这是一个有趣的问题,我会再研究一下!
  • 我编辑了我的回复,希望它现在更有帮助。基本上我在条件上添加了一个 $watch 并在条件更改时重新检查了有效性
猜你喜欢
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
相关资源
最近更新 更多