使用$validators管道在AngularJS中进行密码匹配会产生意外结果
参见示例 使用$validators管道,我试图检查一个字段是否包含与另一个字段相同的值 本例中的每个输入都与其他输入相关联,因此预期结果如下:使用$validators管道在AngularJS中进行密码匹配会产生意外结果,angularjs,angularjs-directive,Angularjs,Angularjs Directive,参见示例 使用$validators管道,我试图检查一个字段是否包含与另一个字段相同的值 本例中的每个输入都与其他输入相关联,因此预期结果如下: 在输入#1中输入一个值 在输入#2中输入相同的值 这两个字段现在都应该有效 更改输入#1中的值 输入#1应无效(或输入#2或两者都无效) 最初,我在当前模型和要等于的目标上都使用了$watch,因此只有两个字段中的一个需要使用该指令。然而,随着$validators管道的引入,此方法意外停止工作(可能是一个bug) 无论如何,正如您所看到的,当第二
- 在输入#1中输入一个值
- 在输入#2中输入相同的值
- 这两个字段现在都应该有效
- 更改输入#1中的值
- 输入#1应无效(或输入#2或两者都无效)
$watch
,因此只有两个字段中的一个需要使用该指令。然而,随着$validators
管道的引入,此方法意外停止工作(可能是一个bug)
无论如何,正如您所看到的,当第二个输入被更改时,相关输入的值为未定义
解决方案
我通过以下方法解决了这个问题:
正如Nikos所说,这两个实例相互抵消,因此这由以下代码修复:
$scope.$watch('passwordWatch', function(pass) {
$control.$validate();
});
现在,当目标输入更改时,当前输入将重新验证。当当前输入更改时,它会自动验证(与往常一样) 一个问题是,当验证器失败(返回
false
)时,基础模型值被设置为未定义
。因此:
“aaa”
;这与passwordConfirm
不同,因此验证器返回false
,模型获得未定义的值
未定义的和未定义的!==“aaa”
,因此密码确认验证器也返回false
哈哈,我完全忽略了这一点。$validators管道上的文档目前缺乏,所以我不知道它是这样做的。有没有关于怎么做的建议?:)事实上我试过调整小提琴,但它似乎比调整更复杂,或者我做错了什么。希望稍后我会回到这个话题。我想做的是使用经典的
$parsers
/$formatters
而不是$validator
。$parsers
/$formatters
允许您返回一个值,即使输入无效,仍然可以(?)更新模型,然后下一次检查可能会成功。请查看主问题中的“我的编辑”。目前,我只通过监听两个输入中的一个,并在目标发生变化时重新验证,使其正常工作。