Voglio limitare l'UI Datepicker angolare tra due date passate come variabili. Preferibilmente mi piacerebbe farlo funzionare senza aggiungere una libreria come momentjs, perché questo è l'unico campo in cui ho bisogno di lavorare con le date.AngularUI Datepicker disabilita le date al di fuori dell'intervallo
Ecco una plunker di questo problema:
http://plnkr.co/edit/zsjpoVZtHqJLIP2RW6vm?p=preview
qui sono le variabili:
mycurrentdate = '2016-04-18'
mymindate = '2016-04-01'
mymaxmonth = '2016-05-01'
mymaxdate will be calculated from mymaxmonth to be
mymaxdate = '2016-05-31'
mia data effettiva max sarà l'ultimo giorno di mymaxmonth
$scope.maxDate = new Date(
$scope.mymaxmonth + (TO THE END OF THE MONTH)
);
Una cosa da notare è che passa attraverso new Date()
restituisce una data che è il giorno prima della data specificata. Per esempio:
$scope.minDate = new Date(
$scope.mymindate
);
$ scope.minDate torna Wed Mar 30 2016 17:00:00 GMT-0700 (PDT)
ho guardato il motivo per cui viene restituito il 30 marzo anziché 1 aprile e sembra un errore di fuso orario?
Desidero impostare un mymindate di '01-04-01 'e ottenere mymaxdate =' 2016-05-31 'e disabilitare tutte le date al di fuori di questo intervallo. Ho letto Beginners Guide to Javascript Date and Time e l'ho provato qui.
Nel controllore ho:
$scope.mymindate = '2016-04-01';
$scope.mymaxmonth = '2016-05-01'; //want mymaxdate to be '2016-05-31'
$scope.minDate = new Date($scope.dt.getFullYear(), $scope.dt.getMonth(), 1);
$scope.maxDate = new Date($scope.dt.getFullYear(), $scope.dt.getMonth() + 1, 0);
Nel modello che ho:
<p class="input-group">
<input type="text" class="form-control" uib-datepicker-popup="{{format}}" ng-model="dt" is-open="popup1.opened" min-date="minDate" max-date="maxDate" datepicker-options="dateOptions" ng-required="true" close-text="Close" alt-input-formats="altInputFormats" />
<span class="input-group-btn">
<button type="button" class="btn btn-default" ng-click="open1()"><i class="glyphicon glyphicon-calendar"></i></button>
</span>
</p>
"* ... sembra un errore di fuso orario *". Non un errore, una scarsa decisione di progettazione da parte degli autori di ECMA-262, vedere [* Perché la nuova data() rimuove un giorno? *] (Http://stackoverflow.com/questions/36698286/why-is-new- data-rimozione-un-giorno-javascript). L'unico modo per evitare l'analisi scomoda del costruttore * Date * (e * Date.parse *, sono equivalenti) è quello di analizzare manualmente la data. Quindi scrivi una funzione (2 linee di codice) o usa una libreria. Ci sono molte piccole librerie di analisi e formattazione su GitHub, o vai per moment.js se hai altre cose da fare. – RobG
Oh, tieni presente che se hai una data per il 31 maggio 2016 e aggiungi un mese riceverai il 01-luglio-2016 (poiché non c'è il 31 giugno, si avvicina a luglio). L'aritmetica delle date non è banale e perché la maggior parte usa una piccola (o forse grande) libreria per tali cose. – RobG
@RobG Questa è l'unica volta nella mia applicazione che userò le date quindi preferirei stare lontano dall'aggiungere una dipendenza dalla libreria se possibile. – jenryb