我试图在Bootstrap UI's日期使用DatePicker Moment.js。
如果我将模型值从Moment.js日期转换为标准Date
,然后再将其分配给范围,则可以这样做:
$scope.myDate = moment('2014-11-07T21:20:15').toDate();
但是,我希望它尽可能透明,即无需手动事先转换。
我已尝试通过指令扩展添加包装格式化程序和解析器,但它不能正常工作,因为我期待:
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);
}
});
}
}
})
;
使用此扩展日期会在输入字段中正确显示,但是当弹出窗口打开时,会在其中选择不正确的日期。
另外,我不太确定我应该为指令priority
属性使用什么值,以及我应该在$formatters
和$parsers
调用哪些方法,即{{1} } vs push()
。
有没有办法让Bootstrap UI的DatePicker透明地使用Moment.js日期?
答案 0 :(得分:10)
修改原始的datepickerPopup
和datepicker
指令,可以实现此转换。
在此plunker中,我改变了以下方法:
ngModel.$render
在 datepickerPopup ; parseDate
在 datepickerPopup ; $watch
this.render
在 datepicker ; this.refreshView
在 datepicker ; this.createDateObject
在 datepicker ; $scope.select
在 datepicker ; 有了moment.utc(),我对结果非常满意。让我知道它是否适合你。
答案 1 :(得分:1)
我没有对此进行过测试,但您可以这样做。
创建一个返回正常日期的客户过滤器......如下所示
angular.module('phonecatFilters', []).filter('momentToDate', function() {
return function(momentDate) {
if (moment.isMoment(momentDate)) {
return momentDate.toDate();
}else { return momentDate }
};
});
然后你声明你的指令
ng-model="yourmomentdate | momentToDate"