2

Angular.js internally uses createDateInputType to handle date and time specific input elements with ngModel binding. In this createDateParser is used to parse date/times. for example:
definition of the input[date]:

'date': createDateInputType('date', DATE_REGEXP,
    createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),
    'yyyy-MM-dd'),

definition of the input[time]:

'time': createDateInputType('time', TIME_REGEXP,
    createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']),
   'HH:mm:ss.sss'),

basically it would be possible to change the used date and time formating in the source. but there is no api/option to specify other formats. (i think that would be a good fit for ngModelOptions)

now i just want to extend on the original behavior with an directive and add a parser / formatter that uses a user specified format string. For this i need similar functionality like the createDateParser - so is it possible to use these internal function in a directive?


alternative solution would be to include moment.js as parsing/formatting library.

i have setup a Plunker to demonstrate this - using moment.js - but it would be better to not have to include a external lib if the functionality is somewhere in the core... (the directive only gets active if the browser does not natively support date or time)

iam just adding a parser and a formatter at the first position with array.unshift() so for the formatters it will be called last. For the parser it will be called first.
The formatter just converts the angular/iso formatted string back to a date-object and formats it according the user-given formatString.

ctrl.$formatters.unshift(function(value) {
    if (value) {
        var tempDate = moment(value, format_internal);
        var intDateFormatedString = tempDate.format(scope.formatString);
        return intDateFormatedString;
    }
});

The Parser works the same only in the other direction and with some validating.

ctrl.$parsers.unshift(function(viewValue) {
    var resultString;
    if (viewValue) {
        // momentjs with strict parsing
        var tempDate = moment(viewValue, scope.formatString, true);
        if ( tempDate.isValid() ) {
            ctrl.$setValidity("userInput", true);
             // return as string with internal angular expected format
            resultString = tempDate.format(format_internal);
        }
    }
    return resultString;
});

only partly related:

How to manually rerun formatter chain in angularjs directive with ngModel?

hopefully the style of the 'question' is ok - iam not sure if i have found the right focus.. eventually it would be better to split it up somehow?

TylerH
  • 20,799
  • 66
  • 75
  • 101

0 Answers0