为什么AngularJS中的日期输入字段抛出类型错误?

时间:2014-11-10 21:20:07

标签: javascript html5 angularjs

当我向用户显示填充的可编辑表单时(而非用户输入数据和提交时),会发生错误。数据来自MySQL over REST / JSON,如下所示:

HTML:

<input class="form-control" type="date" name="dateInput" id="dateOfBirth" 
                   ng-model="user.dateOfBirth">

CCONTROLLER:

.controller('EditCtrl', function ($scope, $routeParams, UserDetail, $window) {
        $scope.user = UserDetail.find({}, {'id': $routeParams.id});
}

SERVICE:

service.factory('UserDetail', function ($resource) {

    return $resource(
        'http://localhost:8080/ClearsoftDemoBackend/webresources/clearsoft.demo.users/:id',
        {id: '@id'},
    {
    find: {method: 'GET'},

    });
});

ERROR:

错误:[ngModel:datefmt]预期2010-05-13T00:00:00-04:00为日期

5 个答案:

答案 0 :(得分:13)

AngularJS 1.3添加到输入[date | datetime-local]字段一个新的格式化程序/解析器,用于检查模型是否为Date对象并抛出datefmt异常。

if (value && !isDate(value)) {
    throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);

此问题在previos版本中不存在,我建议考虑升级以避免大噩梦。

workaroud是使用自定义dateFormat指令重置默认格式化程序/解析器,并使用momentjs格式化,将字符串解析为Date。

define(['directives/directives','momentjs'], function(directives,momentjs) {
directives.directive('dateFormat', function() {
      return {
        require: 'ngModel',
        link: function(scope, element, attr, ngModelCtrl) {
          var format=attr.dateFormat;
          //Angular 1.3 insert a formater that force to set model to date object, otherwise throw exception.
          //Reset default angular formatters/parsers
          ngModelCtrl.$formatters.length=0;
          ngModelCtrl.$parsers.length=0;

          ngModelCtrl.$formatters.push(function(valueFromModel) {
             //return how data will be shown in input
              if(valueFromModel){
                 // For momentjs > 2.9 moment global va is not defined use momentjs instead of moment.
                  return moment(valueFromModel).format(format);
              }
              else
                  return null;
          });
          ngModelCtrl.$parsers.push(function(valueFromInput) {
              if(valueFromInput){
                  //For momentjs > 2.9 moment global va is not defined use momentjs instead of moment.
                  return moment(valueFromInput,format).toDate();
              }
              else 
                  return null;
          });
        }
      };
    });
});

更新使用momentjs&gt; 2.9考虑到未定义全局变量的时刻。

2.9 "Deprecation warning: Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release."

AMD需要使用momentjs代替moment。即:

return momentjs(valueFromModel).format(format);

答案 1 :(得分:6)

因为根据Angular,这不是一个有效的日期。 Check out the doc on input[date]关于日期验证的说明。因为它是一个日期,它的格式应为YYYY-MM-DD。

答案 2 :(得分:1)

在你的api

$date = date("Y-m-d");
$new_date = date("c",strtotime($date));
echo json_encode(array("date"=>$new_date));

在您的控制器中

/* var date 
* this is value from your api
*/
$scope.date = new Date(date);

答案 3 :(得分:1)

对于数组中的日期值,可以将其用作:

    var dates = [
      { id: "1" , date: "2015-04-20T11:24:20.882Z"},
      { id: "2" , date: "2015-05-20T11:24:20.882Z"},
      { id: "3" , date: "2015-06-20T11:24:20.882Z"},
    ];

      function dateStringToObject (data) {
        for(var i=0; i < data.length; i++ ){
          data[i].date = new Date(data[i].date);
          }

        return data;
      }

   dateStringToObject(dates);

答案 4 :(得分:0)

基本上它不是关于格式,它想要一个有效的ISO格式的新Date()对象,所以无论你得到什么响应,只需要做一个新的Date和angular会很高兴,当我解析引起的异常消息时我得到了这个通过角度

https://docs.angularjs.org/error/ngModel/datefmt?p0=2015-11-24