我创建了一个自定义验证器,要求日期在过去.当将该日期手动输入到该字段时,验证似乎很有用.但是,如果我以编程方式更改日期(直接更改模型,而不是在字段中输入),验证不会触发.
我相信我正在按照文档中的指示进行自定义验证指令. Here is a jsFiddle说明问题.在小提琴中,如果您单击“更改日期程序”按钮,您可以看到验证错误不会显示(但是如果您手动更改它).这里是指令代码(也在小提琴中):
myApp.directive('pastDate',function() { return { restrict: 'A',require: '?ngModel',link: function (scope,element,attrs,ctrl) { ctrl.$parsers.unshift(function (viewValue) { var today = new Date(); today = new Date(today.getFullYear(),today.getMonth(),today.getDate()); if (new Date(viewValue) < today) { ctrl.$setValidity('pastDate',true); return viewValue; } ctrl.$setValidity('pastDate',false); return undefined; }); } }; });
模型绑定有两种方式,$解析器控制视图到模型方向的流水线,$formatters控制模型到视图方向的流水线.当您更新控制器中的模型时,更改将通过$formatters管道.
myApp.directive('pastDate',ctrl) { function validate (value) { var today = new Date(); today = new Date(today.getFullYear(),today.getDate()); if (new Date(value) < today) { ctrl.$setValidity('pastDate',true); return value; } ctrl.$setValidity('pastDate',false); return value; } ctrl.$parsers.unshift(validate); ctrl.$formatters.unshift(validate) } }; });