当前位置: 首页 > 面试题库 >

Angular 1.3中新内置的“ parse”验证密钥的目的是什么?

公良育
2023-03-14
问题内容

在Angular 1.2和1.3之间,ngModelController解析管道的行为似乎已更改。现在,我总是看到一个名为'parse'$
的新验证密钥添加到所有$error对象,并且只要其中一个解析器返回undefined,它就会覆盖/替换所有可能已经设置的其他验证密钥。

例如,这是Angular 1.2.23中的一个有效示例-尝试输入超出范围的数字:

http://jsfiddle.net/8doq0saf/5/

在1.3-rc下运行的同一事物会产生不同的结果:

http://jsfiddle.net/1t52s9b2/4/

我尚未找到有关此更改的任何文档。解析键的目的是什么,如何更改代码以恢复旧的行为?

angular.module('app', []).directive('number', function () {
    return {
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {

            // valid number
            ctrl.$parsers.push(function (value) {
                var valid = angular.isUndefined(value) || value === '' || isFinite(value);
                ctrl.$setValidity('number', valid);
                return valid
                    ? angular.isUndefined(value) || value === '' ? undefined : Number(value)
                    : undefined;
            });

            ctrl.$parsers.push(function (value) {
                if (!angular.isDefined(attrs.minNumber)) {
                    return value;
                }
                var valid = angular.isUndefined(value) || Number(value) >= Number(attrs.minNumber);
                ctrl.$setValidity('minNumber', valid);
                return valid ? value : undefined;
            });

            ctrl.$parsers.push(function (value) {
                if (!angular.isDefined(attrs.maxNumber)) {
                    return value;
                }
                var valid = angular.isUndefined(value) || Number(value) <= Number(attrs.maxNumber);
                ctrl.$setValidity('maxNumber', valid);
                return valid ? value : undefined;
            });
        }
    };
});

问题答案:

Angular 1.3使事物合理化,从而在 解析验证 之间进行了清晰的区分。

Angular现在会自动向所有$error集合添加一个“解析”键,并相应地设置其值-
true如果返回任何解析器undefinedfalse则返回。

对于无法解析的值(为数字输入的字母,格式错误的日期等),我们应该undefined从解析器返回。这将导致Angular删除$error已设置的所有键,并用just替换整个对象{ "parse": true }。不再运行解析器。该模型将不会更新。$parsers现在,该数组仅应用于解析。

验证方式

ngModelController具有一个新$validators属性,我们可以向其分配验证功能。这些仅在解析管道成功的情况下运行。从这些函数之一返回false,以获取可解析为所需数据类型的值,但仅是无效的(字符串太长,数字超出范围等)。验证器函数的名称成为$error对象中的验证键。即使一个返回,也将运行所有验证器false。仅当验证成功后,才会更新模型。

这可能是现有应用程序的重大变化,因为人们经常undefined从解析器返回无效值。这是我所拥有的,这是一个典型的示例:

ctrl.$parsers.push(function (value) {
    if (!angular.isDefined(attrs.minNumber)) {
        return value;
    }
    var valid = angular.isUndefined(value) || Number(value) >= Number(attrs.minNumber);
    ctrl.$setValidity('minNumber', valid);
    return valid ? value : undefined;
});

在这种新方案下,应将其移至验证功能:

ctrl.$validators.minNumber = function (value) {
    return !value || !angular.isDefined(attrs.minNumber) || (value >= Number(attrs.minNumber));
});

这是已修复所有问题的指令:

angular.module('app', []).directive('number', function () {
    return {
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {

            // valid number
            ctrl.$parsers.push(function (value) {
                if(value === '') return value;
                return isFinite(value) ? Number(value) : undefined;
            });

            ctrl.$validators.minNumber = function (value) {
                return !value || !angular.isDefined(attrs.minNumber) || (value >= Number(attrs.minNumber));
            };

            ctrl.$validators.maxNumber = function (value) {
                return !value || !angular.isDefined(attrs.maxNumber) || (value <= Number(attrs.maxNumber));
            };
        }
    };
});

http://jsfiddle.net/snkesLv4/10/

我真的很喜欢这种新方法-它更清洁。



 类似资料:
  • 我有一个windows服务器,我需要从它使用sftp将文件传输到另一个服务器。目标服务器可能是Linux或windows box。 我的问题是,我必须在我的windows机器上依赖第三方sftp服务器软件,还是spring集成解决了这个问题? 我应该如何在windows box上生成公钥和私钥对?

  • 任何一个可以黑进我的代码并获得客户端id、租户id和证书指纹的人都可以访问存储在我的密钥库中的秘密。那么,这与直接将秘密值存储在我的代码中,让任何一个黑进我代码的人都能读到有什么区别呢?

  • 我在理解RSA签名和验证的概念方面有一个小问题。问题是我可以创建密钥对(公钥和私钥),这是完全好的。 签名和验证如下: 当我打印myPrivateKey和myPublicKey时,我看到公钥和私钥的模(n)和公钥指数(e)是相同的。 我已经将公钥和私钥转换为base64和hex,我得到了不同的值,这是非常好的。但是,我不能用base64或十六进制对消息进行签名。我只能用我从这里得到的东西来签名:

  • null 大多数示例使用makecert或New-SelfSignedCertificate创建证书。在这种情况下,对于生产应用程序,自签名证书是否有问题?这仅供应用程序使用Azure Key Vault进行身份验证,客户机在浏览器中不会看到这一点。 如果在这种情况下,自签名证书仍然不受欢迎,那么从受信任的权威机构购买证书是否与购买SSL/TLS证书的过程相同?甚至是同一类型的证书吗?

  • 问题内容: 我有一个字段,例如,在表中应该是唯一的。 使用Spring / Hibernate验证进行验证的最佳方法是什么? 问题答案: 一种可能的解决方案是创建自定义约束(和相应的验证器)。并要查找数据库中的现有记录,请提供(或Hibernate)to 的实例。 EntityManagerAwareValidator ConstraintValidatorFactoryImpl 唯一键 Uniq

  • 我正在经历cs50,我被困在pset2凯撒。我按照指示一步一步地进行,我已经通过了关于验证密钥的部分——确保命令行参数只是一个数字(./caesar 20),如果不是(./caesar 20x或。/caesar xyz),则打印出用法:/caesar密钥\n.但一旦我添加下一行提示用户输入明文,然后打印回密文,它似乎不会注册验证密钥的前几行。我知道哈佛大学的学术诚信政策,所以我更多地是在寻求这方面