Validation 检测ng模型更改为指令

Validation 检测ng模型更改为指令,validation,angularjs,angularjs-directive,Validation,Angularjs,Angularjs Directive,我正在做一个自定义验证(指令),比较两个日期,如果开始日期大于结束日期,则显示错误。。。 我正在通过ng模型传递开始日期 ng-model="start_date" 并以我的指令结束日期: lower-than-date="{{end_date.toISOString()}}" //ignore the toISOString() 我正在使用指令的输入 <input type="text" ng-model="start_date" datepicker-popup="yyyy-MM-

我正在做一个自定义验证(指令),比较两个日期,如果开始日期大于结束日期,则显示错误。。。 我正在通过ng模型传递开始日期

ng-model="start_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;
            });
        }
    };
}])

指令

<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;
            });
        }
    };
}])
.directive(“lowerstandarte”、['$parse',function($parse){
返回{
要求:'ngModel',
链接:函数(范围、元素、属性、ctrl){
var lowerThan=null;
函数重新验证日期(_val){
var valid=\u val&&lowerThan?\u val
此代码工作正常,但只有在更改结束日期时才会触发验证。我还想验证何时更改开始日期

因此,问题是:当开始日期更改时,如何“观察”ng模型值以触发验证

注:
这是比较日期的通用指令。记住这一点。

在链接函数中设置绑定到
ngModel

var modelValue = $parse(attr.ngModel);

scope.$watch(modelValue, function(value) {
  // validate value against endDate.
});

在链接功能中设置绑定到
ngModel

var modelValue = $parse(attr.ngModel);

scope.$watch(modelValue, function(value) {
  // validate value against endDate.
});
您应该创建一个格式化程序:“当模型值更改时,作为管道执行的函数数组”

所以,只要做一些类似的事情:

        function revalidate(_val) {
            var valid = _val && lowerThan ? _val < lowerThan : true;
            ctrl.$setValidity('lowerThanDate', valid);
            return _val;
        }
        ....
        ctrl.$formatters.unshift(revalidate);
        ctrl.$parsers.unshift(revalidate);
功能重新验证(\u val){
var valid=\u val&&lowerThan?\u val
原因可能是模型是从其他地方更改的,而不是直接在DOM元素中更改的。

您应该创建一个格式化程序:“当模型值更改时,作为管道执行的函数数组”

所以,只要做一些类似的事情:

        function revalidate(_val) {
            var valid = _val && lowerThan ? _val < lowerThan : true;
            ctrl.$setValidity('lowerThanDate', valid);
            return _val;
        }
        ....
        ctrl.$formatters.unshift(revalidate);
        ctrl.$parsers.unshift(revalidate);
功能重新验证(\u val){
var valid=\u val&&lowerThan?\u val

原因可能是模型是从其他地方更改的,而不是直接在DOM元素中更改的。

我认为您应该能够$观察ctrl属性或ctrl的子属性之一来查找模型。我认为您应该能够$观察ctrl属性或ctrl的子属性之一来查找模型。