używam kątowa Bootstrap UI DatePicker: https://angular-ui.github.io/bootstrap/#/datepickerParse datę ciąg do obiektu Date podczas ładowania kątowa Bootstrap UI Datepicker
Kiedy renderowanie formularza za pomocą danych otrzymanych z serwera, nie ma problemu z pola datetime. Moja datepicker wejściowe wygląda następująco:
<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>
mój serwer zwraca datetime odpowiedzi jako JSON wyrażenie:
{
...
startedAt: "2015-05-29T02:00:00+0200"
}
Kiedy przypisać danych odpowiedzi do modelu $scope.item = response;
, datepicker pola wejściowe są wyświetlane poprawnie (poprawna data jest wybrane i jest poprawnie sformatowane w wybranym formacie). Problem polega na tym, że walidacja nie przechodzi. I otrzymujemy:
itemForm.startedAt.$invalid == true
zauważyłem, że dane związane z polem datepicker powinny być Date
przedmiot i nie string (kiedy wybrać nową datę z datepicker, $scope.item.startedAt
jest Date
)
udało mi się obejść ten problem i to zrobić w kontrolerze:
$scope.item = response;
$scope.item.startedAt = new Date($scope.item.startedAt);
to działa w ten sposób ... Ale nie chciałbym, aby ręcznie przekonwertować ciąg datę zrobić za każdym razem dostaję odpowiedzi z serwera. Starałem się stworzyć dyrektywę, które można przypisać do pola datepicker więc konwertuje ng-model
dla mnie:
.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;
});
}
}
})
to działa, bo teraz widzę Date
przedmiot, kiedy modelu wyjście moim zdaniem : {{item.startedAt}}
. Jednak wciąż nie można sprawdzić poprawności ! Podejrzewam, że jest to problem ze zrozumieniem, w jaki sposób dane przepływają między modelem a widokiem, oraz jak działa Bootstrap w interfejsie użytkownika.
Również kiedy mogę zmienić dyrektywę z $formatters.push
do $formatters.unshift
, walidacja działa OK, ale datepicker nie sformatować datetime (insted ładnie formattet yyyy-MM-dd
widzę ciąg ISO wewnątrz wejście)
AWW człowieka jesteśmy o dokładnie ten sam problem tutaj !!! –
@VictorParmar obecnie robię to na odwrót - konwertowanie łańcucha odpowiedzi na obiekt Date podczas odbierania z serwera. I konwertowanie obiektu Date na ciąg znaków podczas wysyłania na serwer. Wszystko to odbywa się ręcznie w regulatorze kątowym. Może po prostu wydobędę tę logikę jako usługę Angular, ale nie sądzę, że można to zrobić za pomocą dyrektywy – rsobon
tak, przyłącz się do klubu - skończyło się na zrobieniu tego samego :) –