我正在进行自定义验证(指令)来比较两个日期,如果start_date大于end_date则显示错误... 我正在通过ng-model
传递start_dateng-model="start_date"
和end_date与我的指令:
lower-than-date="{{end_date.toISOString()}}" //ignore the toISOString()
我正在使用我的指令的输入......
<input type="text" ng-model="start_date"
datepicker-popup="yyyy-MM-dd" min="today" show-weeks="false"
lower-than-date="{{end_date.toISOString()}}"/>
指令......
.directive("lowerThanDate", ['$parse', function($parse) {
return {
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
var lowerThan = null;
function revalidate(_val) {
var valid = _val && lowerThan ? _val < lowerThan : true;
ctrl.$setValidity('lowerThanDate', valid);
}
attrs.$observe('lowerThanDate', function(_value) {
//Here I'm detecting when end_date change
lowerThan = new Date(_value);
revalidate(ctrl.$modelValue);
});
ctrl.$parsers.unshift(function(_value) {
revalidate(_value);
return _value;
});
}
};
}])
此代码工作正常,但只有在我更改end_date 时才会触发验证。我想验证何时更改start_date。
所以,问题是:当start_date改变时,如何“观察”ng-model值以触发验证。
注意: 这是比较日期的通用指令。记住这一点。
答案 0 :(得分:5)
在链接功能中设置与ngModel
的绑定:
var modelValue = $parse(attr.ngModel);
scope.$watch(modelValue, function(value) {
// validate value against endDate.
});
答案 1 :(得分:0)
你应该是格式化程序:“每当模型值改变”时,作为管道执行的函数数组。
所以只需做一些事情:
function revalidate(_val) {
var valid = _val && lowerThan ? _val < lowerThan : true;
ctrl.$setValidity('lowerThanDate', valid);
return _val;
}
....
ctrl.$formatters.unshift(revalidate);
ctrl.$parsers.unshift(revalidate);
原因可能是模型从其他地方改变,而不是直接在DOM元素中改变。