1

我自己做了一个自定义验证器,它的工作原理与我想要的一样AngularJS 1.2但现在我想升级到1.3的最新且几乎稳定的版本,但调试有一段时间我发现它不能按预期工作,因为我使用$timeoutctrl.$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); 

我手动更改$setValidityfalse,因为我想确保用户前,将不会发布形式该字段实际上已经完成验证。只有超时才能让用户在打字完成后(或至少在1.5秒后停止输入)才显示错误(如果有),从而为用户带来更流畅的体验。在1.5秒的超时完成后,validate(value)开始并且应该更新$setValidity为true或false ...这在AngularJS 1.2中完全正常,但完全没有在1.3中。即使我自己手动设置$setValiditytrue它不起作用,实际上停留在false状态,但如果我删除$timeout包装,那么它工作正常......但我真的需要并希望我的超时工作!
为了参考的角度来看,我的自定义验证器是免费提供给任何人在这Github link

任何帮助,非常感谢。

编辑
在@SKYWALKR(感谢您的帮助)的帮助下,我进一步调试了我的问题,它实际上比我之前描述的要多得多。我的问题似乎实际上涉及到一堆东西在一起,ng-model绑定里面ng-repeat执行一个自定义验证程序有问题只有如果我启用$timeout ...现在所有的一起,绑定不能正常工作,哇,我花了一段时间为此建立一个适当的测试案例。因此,这里是我的问题的样本:

plunker

当您运行在第一个样品,你会看到,没有任何输出中的:{{结合}}在工作(它假设显示所键入的正下方它)它不起作用,但如果你注释掉var timer$timeout(注释掉第39,42和44行),然后再运行它,现在它可以工作......那么为什么?什么坏了?

回答

1

您的正确,1.3是不稳定的版本。您的指令使用1.3.0-rc.0正常工作...请参阅下面的plunkr。

http://embed.plnkr.co/GSU2Ldn0D2YM0aD9PQla/preview

+0

嗯是的,你是对的,它的工作..我可能会在错误的方向已经看过。相反,问题看起来更像绑定,'ng-model'不会在控制器中返回我的值。所以基本上我有我的自定义验证器,并且一旦它完成验证,就会执行一个'ng-change'事件,然后从那里获取ng-model的值,但是如果我删除'$ timeout',它将返回'undefined'确实像往常一样获得价值......即使在你的游戏中,我也无法获得屏幕上的绑定。对不起,您知道调试世界:S – ghiscoding 2014-09-06 05:08:39

+0

非常感谢您的帮助,我分叉您的闯入者,并创造出我的实际问题的另一个大野兽。我编辑了我的问题,这是一个比我预期的更大的问题..请帮助! – ghiscoding 2014-09-06 05:47:20