NgModelController: update view value after parser execution

I have the following directive:

 myDirectives.directive('simpleDate', function ($filter, $locale, $timeout) {
    return {
        require: 'ngModel',
        restrict: 'A',
        link: function (scope, elem, attrs, ctrl) {
            var dateFormat = 'shortDate';

            ctrl.$formatters.unshift(function (modelValue) {
                if (!modelValue) {
                    return '';
                } else {
                    return $filter('date')(modelValue, dateFormat);
                }
            });

            ctrl.$parsers.unshift(function (viewValue) {
                if (!isNaN(viewValue)) {
                    var now = new Date(),
                        year = now.getFullYear(),
                        month = now.getMonth() + 1,
                        day = Number(viewValue),
                        lastDay = (new Date(year, month, 0)).getDate();
                    if (day >= 1 && day <= lastDay) {
                        return '' + year + (month < 10 ? '-0' : '-') + 
                            month + (day < 10 ? '-0' : '-') + day;
                    }
                }

                return '';
            });
        }
    };     
 });

      

Parser computes the model value and should reflect the rearview value; but how? I know there is a ctrl method. $ Render (), but my guess is that it should run after $ parser is executed. The following actions were not performed:

$timeout(function () { ctrl.$render(); });

      

How can I render the value of the view?

+3


source to share


1 answer


Is this what you expect?



 myDirectives.directive('simpleDate', function ($filter, $locale, $timeout) {
    return {
        require: 'ngModel',
        restrict: 'A',
        link: function (scope, elem, attrs, ctrl) {
            var dateFormat = 'shortDate';

            ctrl.$formatters.unshift(function (modelValue) {
                if (!modelValue) {
                    return '';
                } else {
                    return $filter('date')(modelValue, dateFormat);
                }
            });

            ctrl.$parsers.unshift(function (viewValue) {
                if (!isNaN(viewValue)) {
                    var now = new Date(),
                        year = now.getFullYear(),
                        month = now.getMonth() + 1,
                        day = Number(viewValue),
                        lastDay = (new Date(year, month, 0)).getDate();
                    if (day >= 1 && day <= lastDay) {
                        var currentValue = '' + year + (month < 10 ? '-0' : '-') + month + (day < 10 ? '-0' : '-') + day;
                        ctrl.$setViewValue(currentValue);
                        ctrl.$render();
                        return currentValue;
                    }
                }

                return '';
            });
        }
    };     
 });

      

0


source







All Articles