Autoriser Moment.js dates dans bootstrap-ui datepicker

J'essaie d'utiliser Bootstrap UI's DatePicker avec Moment.js dates.

Il est possible si je convertissez ma valeur de modèle de Moment.js date à Date standard avant de l'affecter à une portée:

 $scope.myDate = moment('2014-11-07T21:20:15').toDate(); 

Cependant, j'aimerais qu'il soit aussi transparent que possible, c'est-à-dire sans avoir besoin d'une conversion préalable manuelle.

J'ai essayé d'ajouter des formateurs et des analyseurs d'emballage par extension de directive, mais ça ne fonctionne pas comme j'attends:

 angular .module('DatepickerWorkaround', []) .directive('datepickerPopup', function () { return { restrict: 'EAC', require: 'ngModel', priority: -10, link: function ($scope, element, attrs, ngModel) { // Remove the default formatter from the input directive to prevent conflict. // This is required for compatibility with AngularJS 1.3.x. ngModel.$formatters.shift(); // Casting Moment.js date to standard date. ngModel.$formatters.unshift(function(momentDate) { if (moment.isMoment(momentDate)) { return momentDate.toDate(); } }); // Casting standard date back to Moment.js date. ngModel.$parsers.push(function(date) { if (date instanceof Date) { return moment(date); } }); } } }) ; 

Cette date d'extension s'affiche correctement dans le champ de saisie, mais lorsque la fenêtre contextuelle s'ouvre, la date incorrecte est sélectionnée à l'intérieur de celle-ci.

En outre, je ne suis pas sûr de la valeur que je dois utiliser pour la propriété de priority directive et sur quelles méthodes puis-je appeler $formatters et $parsers , c'est-à-dire push() vs unshift() .

Existe-t-il un moyen de faire fonctionner le DatePicker de Bootstrap UI avec les dates Moment.js de manière transparente?

Décorant les directives datepickerPopup et datepicker originales, il est possible d'effectuer cette conversion.

Dans ce plunker, j'ai changé les méthodes suivantes:

  • ngModel.$render on datepickerPopup ;
  • parseDate sur datepickerPopup ;
  • MinDate et maxDate $watch es on datepicker ;
  • this.render on datepicker ;
  • this.refreshView on datepicker ;
  • this.createDateObject sur datepicker ;
  • $scope.select on datepicker ;

Avec moment.utc () et je suis plutôt satisfait des résultats. Dites-moi si cela marche pour vous.

Je n'ai pas testé ceci, mais vous pourriez le faire.

Créez un filtre client qui renvoie la date normale … quelque chose comme ci-dessous

 angular.module('phonecatFilters', []).filter('momentToDate', function() { return function(momentDate) { if (moment.isMoment(momentDate)) { return momentDate.toDate(); }else { return momentDate } }; }); 

Ensuite, où vous déclarez directive ng-model="yourmomentdate | momentToDate"