【问题标题】:AngularJS digest cycle bug, ngmodel wiped on custom validationAngularJS 摘要循环错误,ngmodel 在自定义验证中被擦除
【发布时间】:2015-02-18 03:47:30
【问题描述】:

作为 AngularJS 的新手,我在为下拉选择编写自定义验证时遇到了一个非常奇怪的错误。

如您所料,我用

编写了这个下拉菜单
<select name="somename" id="someid" ng-model="foo" ng-model-options="{allowInvalid: true}"  validate-input>
 <option></option> 
 <option></option>
</select>

在这种情况下,验证输入是我的自定义指令。是这样写的:

directives.directive("validateInput", function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, ele, attrs, ctrl) {
            ctrl.$validators.isAcceptable = function (value) {

                var status = false;

                if (value === '0') {
                    status = true;
                }

                return status;

            };
        }
    }
});

在这种情况下,isAcceptable 是我正在创建的标志。

无论如何,对于实际问题本身。每当我启动应用程序时,我发现 ng-model 的实际值已被“擦除”。也就是说,它要么是未知的,要么是 NaN(当然取决于输入)。为了解决这个问题,我在选择标签中添加了以下指令:ng-model-options="{allowInvalid: true} 但是,这并没有解决我的问题。

这个问题如此严重的原因是,当 ng-model 被错误验证(设置为 NaN 或未知)擦除时,这会在以后的应用程序中导致重大错误。我能想到的唯一解决方案是使 ng-model="0" 或 ="" (这是一个错误的验证)并保留这些值,而不是从应用程序中擦除模型本身。

【问题讨论】:

  • 另外,只是补充一下,在调试时我可以确认这肯定是由自定义验证引起的。当我取出时,ng-model 实际上永远不会是 NaN 或 undefined

标签: javascript html angularjs web angularjs-directive


【解决方案1】:

试试这样的:

directives.directive("validateInput", function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, ele, attrs, ctrl) {
            ctrl.$validators.isAcceptable = function (modelValue, viewValue) {
                var value = modelValue || viewValue;
                return value === '0' ? true : false;
            };
        }
    }
});

modelValue 仅在 viewValue 满足验证条件后设置。所以在初始化时它是空白的,另一个验证器可能会阻止它设置值。

您可能完全想改用这种格式:

directives.directive("validateInput", function () {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, ele, attrs, ctrl) {
            var setValidator = function (value) {
                var isValidFormat = function () {
                    return $value === '0' ? true : false;
                };
                ctrl.$setValidity('isAcceptable', isValidFormat);
                return value;
            };
            ctrl.$parsers.unshift(setValidator);
            ctrl.$formatters.unshift(setValidator);
        }
    }
});

【讨论】:

  • 谢谢!它最终成为让我感到困惑的 modelValue。
猜你喜欢
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多