2017-06-29 137 views
0

我正在使用UI Bootstrap Datepicker Popup,并且我想使用自定义日期格式。我的休息服务以'dd/MM/yyyy'格式向我发送日期。 我想使用这种格式,但在更改模型值时,日期选取器不会更新。我定义了uib-datepicker-popup="dd/MM/yyyy",但似乎没有工作。UI Bootstrap Datepicker弹出日期格式

Plunker:https://plnkr.co/edit/SfSXmeL0ue0yef1yTKMO?p=preview

angular.module('ui.bootstrap.demo', ['ngAnimate', 'ngSanitize', 'ui.bootstrap']); 
 
angular.module('ui.bootstrap.demo').controller('DatepickerPopupDemoCtrl', function ($scope) { 
 
    $scope.today = function() { 
 
    $scope.dt = '02/01/2017'; 
 
    }; 
 

 
    $scope.clear = function() { 
 
    $scope.dt = null; 
 
    }; 
 

 
    $scope.dateOptions = { 
 
    formatYear: 'yy', 
 
    startingDay: 1 
 
    }; 
 

 
    $scope.open1 = function() { 
 
    $scope.popup1.opened = true; 
 
    }; 
 

 
    $scope.popup1 = { 
 
    opened: false 
 
    }; 
 
});
<!doctype html> 
 
<html ng-app="ui.bootstrap.demo"> 
 
    <head> 
 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.js"></script> 
 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-animate.js"></script> 
 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-sanitize.js"></script> 
 
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-2.5.0.js"></script> 
 
    <script src="example.js"></script> 
 
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> 
 
    </head> 
 
    <body> 
 

 
<style> 
 
    .full button span { 
 
    background-color: limegreen; 
 
    border-radius: 32px; 
 
    color: black; 
 
    } 
 
    .partially button span { 
 
    background-color: orange; 
 
    border-radius: 32px; 
 
    color: black; 
 
    } 
 
</style> 
 
<div ng-controller="DatepickerPopupDemoCtrl"> 
 
    <pre>Selected date is: <em>{{dt | date:'fullDate' }}</em></pre> 
 

 
    <h4>Popup</h4> 
 
    <div class="row"> 
 
     <div class="col-md-6"> 
 
     <p class="input-group"> 
 
      <input type="text" class="form-control" uib-datepicker-popup="dd/MM/yyyy" ng-model="dt" is-open="popup1.opened" 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> 
 
     </div> 
 

 

 
    </div> 
 

 
    <hr /> 
 
    <button type="button" class="btn btn-sm btn-info" ng-click="today()">Today</button> 
 
</div> 
 
    </body> 
 
</html>

在plunker: - 点击 “今天”,使$scope.dt = '02/01/2017' - 打开日期选择器弹出,它初始化上月1日,而不是月第二个

+0

您需要发布的亲一个小例子,瑕疵代码和标记在这里,而不是你的明天可以改变或消失,帮助未来没有人的运动员:https://stackoverflow.com/help/mcve – Rob

+0

我添加了一个代码段 – jaudo

回答

2

经过一番研究,我觉得我一直在寻找一个指令添加自定义解析器和格式:

.directive('dateFormatter', [ 
    function() { 
     return { 
      restrict: 'A', 
      require: 'ngModel', 
      link: function postLink(scope, element, attrs, ngModel) { 
       ngModel.$parsers.push(function(data) { 
       return moment(data).format('DD/MM/YYYY'); 
       }); 

       ngModel.$formatters.push(function(data) { 
       return moment(data, 'DD/MM/YYYY').toDate() 
       }); 
      } 
     }; 
    } 
]); 

更新plunkr:https://plnkr.co/edit/oi1EtcDmzpzyyKmXvhqz?p=preview

0

UI Bootstrap datepicker将它在内部使用的日期解析器公开为服务。注入uibDateParser服务到您的控制器,并使用解析函数的日期缠斗到正确的格式:

function ($scope, uibDateParser) { 
    $scope.today = function() { 
    $scope.dt = uibDateParser.parse('02/01/2017', 'dd/MM/yyyy'); 
    }; 
... 
} 

https://plnkr.co/edit/u5GRT5QOjdT61zZ36fmE?p=preview

+0

事实上,我通过一个接收日期休息服务,所以我不想做一个新的日期()。我的数据看起来像{begin:“01/02/2017”,结束:“02/02/2017”} – jaudo

+1

我正在寻找一种方法来告诉datepicker它应该使用哪种格式来解析日期。这不可能吗? – jaudo

+0

其实这是可能的... https://github.com/angular-ui/bootstrap/tree/master/src/dateparser –