我有一个指令,旨在对日期输入字段(最早和最晚)施加日期范围限制。这是下面的指令,我使用momentjs库来进行日期比较:
.directive('startDate', function () {
return {
require: 'ngModel',
link: function (scope, element, attrs, ctrl) {
console.log(arguments);
var compareStartDates = function (value) {
var startDateCompare = moment((attrs.startDate ? scope.$eval(attrs.startDate) : '1901-01-01'), 'YYYY-MM-DD');
if (startDateCompare && startDateCompare.isValid() && value && value.match(/\d{4}\-?\d{2}\-?\d{2}/g)) {
var valueMoment = moment(value, 'YYYY-MM-DD');
if (valueMoment && valueMoment.isValid() && valueMoment < startDateCompare) {
ctrl.$setValidity('startdate', false);
ctrl.$error['startdate'] = true;
return undefined;
}
}
ctrl.$setValidity('startdate', true);
return value;
};
ctrl.$parsers.unshift(compareStartDates);
}
};
})
JSFiddle:http://jsfiddle.net/2ug4X/
请看上面的小提琴并执行以下操作:
1)在文本框中输入“A”,模式错误触发。 2)单击“CLICK ME”文本,更新范围内模型的值,注意错误清除 3)在文本框中输入“1800-01-01”,触发日期限制错误 4)在有效日期的文本框中输入“2000-01-01”,应该清除startdate错误但不清除。知道为什么会这样吗?
我希望像这样更新ng-model绑定变量
scope.sample.open_date = '2000-01-01';
会清除输入元素上的错误,就像清除模式错误一样。
答案 0 :(得分:2)
在Stack上搜索更多内容后找到了这个:AngularJS custom validation not firing when changing the model programatically
似乎我的错误也没有将比较函数推送到ctrl。$ formatters如此:
ctrl.$formatters.unshift(compareStartDates);
这就是诀窍!