【问题标题】:AngularJS input type=datetime-local: expected ISO-8601-valid date string to be a dateAngularJS 输入类型=datetime-local:预期 ISO-8601-valid 日期字符串为日期
【发布时间】:2015-07-30 23:35:10
【问题描述】:

使用 AngularJS 和 angular-resource 1.4.1,我有一个超级简单的 Event 服务,其开始日期和可选结束日期:

angular.module('jtm.events').factory( 'Event', [
  '$resource',
  function($resource) {
    var Event = $resource( '/events/:id.json',
      {id: '@id'}
    );

    // EDIT: added this method
    Event.index = function() {
      var events = this.query();
      angular.forEach( events, function($event) {
        $event.start_date = new Date($event.start_date);
      });
      return events;
    };

    return Event;
  }
]);

Event.query() 的典型结果如下所示:

[
  {
    id: 1,
    start_time: "2015-08-25T00:47:16Z",
    end_time: null
    ...
  },
  ...
]

在(面向最终用户的)前端,我通过我设置的 moment.js 过滤器运行这些日期,并按预期呈现它们而没有任何 JS 错误。但是,在管理事件表单上,我有:

<input type="datetime-local" ng-model="event.start_time" ng-required="true">

这是投掷:

Error: [ngModel:datefmt] Expected `2015-08-25T00:47:16Z` to be a date

并在管理表单字段中呈现占位符 mm/dd/yyyy, --:-- -- 掩码。

这不是有效的 ISO 8601 日期字符串吗?我是否需要以某种方式更改我的服务/模块配置才能使其正常工作?

编辑

我没有定义自定义 index 动作,而是使用拦截器覆盖 query 动作配置,将 start_time 字符串包装在适当的 Date 对象中:

angular.module('jtm.events').factory( 'Event', [
  '$resource',
  function($resource) {
    var Event = $resource( '/events/:id.json',
      {id: '@id'},
      {
        query: {
          action: 'query',
          isArray: true,
          transformResponse: function(response) {
            response = angular.fromJson(response);
            angular.forEach( response, function($event) {
              $event.start_time = new Date($event.start_time);
            });
            return response;
          },
        },
      }
    );

    return Event;
  }
]);

【问题讨论】:

    标签: javascript angularjs datetime


    【解决方案1】:

    您需要在输入元素 ng-model 中传递日期对象而不是字符串。

    use this 
    start_time: new Date("2015-08-25T00:47:16Z")
    ins ted of:-
    start_time: "2015-08-25T00:47:16Z" 
    

    您可以通过此链接获取帮助

    [plnkr]:http://plnkr.co/edit/QaA31F?p=preview
    

    【讨论】:

    • 我建议使用一些日期时间选择器库,因为 HTML input type="datetime-local" 仅在 chrome 和 FF 和 IE 中受支持,它将成为简单的 HTML 输入文本元素...
    • 谢谢,这为我指明了正确的方向。但是,start_time 被封装在一个服务中;如何从那里而不是在控制器中将它传递给日期对象? (见编辑)
    • 谢谢,@acobster,您可以使用另一个模式变量绑定到日期字段,并且可以使用 ngModel 选项 getter setter 来跟踪更改并将日期的字符串表示形式存储在您的对象返回表单服务中。您也可以使用 ng-change 来跟踪更改。
    • 谢谢,我最终在我的Event 服务上使用了一个拦截器来完成同样的工作。
    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 2021-01-17
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2016-02-20
    相关资源
    最近更新 更多