AngularJS:创建一个指令,用于将字符串动态转换为Date

时间:2016-03-03 22:39:03

标签: angular-ui-bootstrap angular-ui

在1.13.0之后的某个版本中,Angular UI Bootstrap改变了datepicker所期望的Date的方式。在为它提供ISO日期字符串之前,它现在需要一个Date对象。

我从我的API中使用ISO日期字符串,所以我必须

  • 在将它们提供给datepicker和
  • 之前将它们转换为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; } 个对象
  • 存储时将它们转换回ISO日期字符串。

过去我使用过这样的指令:

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之前,还有其他方法可以转换吗?

1 个答案:

答案 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;
    });
  },
}