I am using Angular UI Bootstrap Datepicker: https://angular-ui.imtqy.com/bootstrap/#/datepicker
When I process the form using the data received from the server, there is a problem with the datetime fields. My datepicker parameter is as follows:
<form name="itemForm"> <input type="datetime" class="form-control" id="startedAt" name="startedAt" ng-model="item.startedAt" ng-click="open($event, 'startedAt')" uib-datepicker-popup="yyyy-MM-dd" is-open="datepickers.startedAt" /> </form>
My server returns a datetime response as a JSON string:
{ ... startedAt: "2015-05-29T02:00:00+0200" }
When I assign response data to the model $scope.item = response; , the input field of the date picker is displayed correctly (the correct date is selected and it is correctly formatted in the selected format). The problem is that validation fails. I get:
itemForm.startedAt.$invalid == true
I noticed that the data bound to the datepicker field should be a Date object, not a string (when I select a new date from datepicker, $scope.item.startedAt is Date )
I managed to get around this problem and do it in the controller:
$scope.item = response; $scope.item.startedAt = new Date($scope.item.startedAt);
This works like this ... But I would not want to manually convert the do date string every time I get a response from the server. I tried to create a directive that I can assign to the date input field so that it changes ng-model for me:
.directive("asDate", function () { return { require: 'ngModel', link: function (scope, element, attrs, modelCtrl) { modelCtrl.$formatters.push(function (input) { var transformedInput = new Date(input); if (transformedInput != input) { modelCtrl.$setViewValue(transformedInput); modelCtrl.$render(); } return transformedInput; }); } } })
Well, this works because now I see the Date object when I output the model in my opinion: {{item.startedAt}} . However, the verification still fails ! I suspect this is some problem with me, understanding how the data flows between the model and the view, and how UT Bootstrap connects.
Also, when I change my directive from $formatters.push to $formatters.unshift , the check works fine, but the datepicker does not format my datetime (insted of niceformattet yyyy-MM-dd I see the ISO line inside the input)