我自己做了一个自定义验证器,它的工作原理与我想要的一样AngularJS 1.2
但现在我想升级到1.3
的最新且几乎稳定的版本,但调试有一段时间我发现它不能按预期工作,因为我使用$timeout
和ctrl.$setValidity
。我原来和工作代码(当然这仅仅是实际代码的一个子集)如下:
var validator = function(value) {
// invalidate field before doing any validation,
// so that it's invalid before typing timeout has time to finish and execute
ctrl.$setValidity('validation', false);
$timeout.cancel(timer);
timer = $timeout(function() {
var isValid = validate(value);
ctrl.$setValidity('validation', isValid);
}, 1500);
return value;
}; // end of validator()
// attach the Validator object to the element
ctrl.$parsers.unshift(validator);
ctrl.$formatters.unshift(validator);
我手动更改$setValidity
到false
,因为我想确保用户前,将不会发布形式该字段实际上已经完成验证。只有超时才能让用户在打字完成后(或至少在1.5秒后停止输入)才显示错误(如果有),从而为用户带来更流畅的体验。在1.5秒的超时完成后,validate(value)
开始并且应该更新$setValidity
为true或false ...这在AngularJS 1.2
中完全正常,但完全没有在1.3
中。即使我自己手动设置$setValidity
到true
它不起作用,实际上停留在false
状态,但如果我删除$timeout
包装,那么它工作正常......但我真的需要并希望我的超时工作!
为了参考的角度来看,我的自定义验证器是免费提供给任何人在这Github link
任何帮助,非常感谢。
编辑
在@SKYWALKR(感谢您的帮助)的帮助下,我进一步调试了我的问题,它实际上比我之前描述的要多得多。我的问题似乎实际上涉及到一堆东西在一起,ng-model
绑定里面ng-repeat
执行一个自定义验证程序有问题只有如果我启用$timeout
...现在所有的一起,绑定不能正常工作,哇,我花了一段时间为此建立一个适当的测试案例。因此,这里是我的问题的样本:
plunker
当您运行在第一个样品,你会看到,没有任何输出中的:{{结合}}在工作(它假设显示所键入的正下方它)它不起作用,但如果你注释掉var timer
和$timeout
(注释掉第39,42和44行),然后再运行它,现在它可以工作......那么为什么?什么坏了?
嗯是的,你是对的,它的工作..我可能会在错误的方向已经看过。相反,问题看起来更像绑定,'ng-model'不会在控制器中返回我的值。所以基本上我有我的自定义验证器,并且一旦它完成验证,就会执行一个'ng-change'事件,然后从那里获取ng-model的值,但是如果我删除'$ timeout',它将返回'undefined'确实像往常一样获得价值......即使在你的游戏中,我也无法获得屏幕上的绑定。对不起,您知道调试世界:S – ghiscoding 2014-09-06 05:08:39
非常感谢您的帮助,我分叉您的闯入者,并创造出我的实际问题的另一个大野兽。我编辑了我的问题,这是一个比我预期的更大的问题..请帮助! – ghiscoding 2014-09-06 05:47:20