在1.13.0之后的某个版本中,Angular UI Bootstrap改变了datepicker所期望的Date
的方式。在为它提供ISO日期字符串之前,它现在需要一个Date
对象。
我从我的API中使用ISO日期字符串,所以我必须
function DateObjectDirective() {
const directive = {
restrict: "A",
require: ["ngModel"],
link(scope, element, attributes, controllers) {
const ngModel = controllers[0];
ngModel.$formatters.unshift(value => {
let output = null;
if(value) {
output = moment(value).toDate();
}
return output;
});
ngModel.$parsers.unshift(value => {
let output = null;
if(value) {
output = moment(value).format();
}
return output;
});
},
};
return directive;
}
个对象
过去我使用过这样的指令:
public MyClass extents Activity
{
public void onCreate(){
}
public class MyAsyncTask extents AsyncTask<Void, Void, Void>
{
protected void doInBackground()
{
//do stuff here....
}
}
public void onResume(){
}
}
这不再有效,因为报告了以下错误:
this.activeDate.getFullYear不是函数
我的猜测是,datepicker仍然使用该字符串作为参考。在将数据提供给datepicker之前,还有其他方法可以转换吗?
答案 0 :(得分:2)
我发现我发布的指令确实仍然有效。唯一的问题是AngularJS评估指令的顺序。
例如:
<input ng-model="someDateString" uib-datepicker-popup="yyyy-MM-dd" woo-date-object>
就我而言,woo-date-object
始终在 uib-datepicker-popup
之前评估。结果是,datepicker总是将自己的格式化程序推到ngModel.$formatters
之上,从而消除了我进行干预的可能性。
解决方案是为自己的指令赋予更高的优先级。 UI的日期选择器没有一个集合,因此任何高于0的值(默认值)都有效:
{
restrict: "A",
require: "ngModel",
priority: 9999,
link(scope, element, attributes, ngModel) {
ngModel.$formatters.push(value => {
let output = new Date();
if(value) { output = moment(value).toDate(); }
return output;
});
ngModel.$parsers.push(value => {
let output = null;
if(value) { output = moment(value).format(); }
return output;
});
},
}