错误:ngModel:datefmt,Model不是日期对象,期望`yyyyMMdd`是日期

时间:2017-08-20 20:51:09

标签: angularjs

我的模型可以正常使用下面的代码但是它在控制台中输出错误,因为输入类型是日期,模型中的数据类型绑定错误。如何指示确保不应出现警告并且绑定值是正确的。 我想将我的模型值显示为日期,并将其保留为模型中的INT。 我的模型使用

$scope.start_date = "20170818";

HTML

<input type="date" Date-Converter ng-model="start_date" />
  

错误:ngModel:datefmt模型不是日期对象预期20170818   是一个约会

// Converts value parameter from yyyyMMdd into yyyy/MM/dd format and vice versa
app.directive('dateConverter', function($filter) {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, element, attr, ngModel) {
            if (!ngModel) return; // do nothing if no ng-model

            ngModel.$formatters.length=0;
            ngModel.$parsers.length=0;

            function fromUser(text) {
                var value = $filter('date')(text, "yyyyMMdd");                  
                return value;
            }

            function toUser(text) {             
                var value = new Date();
                if(text != undefined && text!='' && text.length==8){
                    var year        = text.substring(0,4);
                    var month       = text.substring(4,6);
                    var day         = text.substring(6,8);              
                    var value        = new Date(year, month-1, day);
                }
                return value;               
            }

            ngModel.$parsers.push(fromUser);
            ngModel.$formatters.push(toUser);
        }
    };
});

1 个答案:

答案 0 :(得分:0)

您的问题应与此行代码相关:

var value = $filter('date')(text, "yyyyMMdd"); 

您正在使用AngularJS日期过滤器,但如果查看官方页面,该方法的第一个参数如下:

  

格式化日期对象,毫秒(字符串或数字)的日期   或各种ISO 8601日期时间字符串格式(例如   yyyy-MM-ddTHH:mm:ss.sssZ及其较短的版本   yyyy-MM-ddTHH:mmZ,yyyy-MM-dd或yyyyMMddTHHmmssZ)。如果没有时区   在字符串输入中指定,时间被认为是在   当地时区。

https://docs.angularjs.org/api/ng/filter/date

所以你应该提供毫秒,即使它们是字符串或int,但是它们应该代表毫秒,而不是你的日期格式20170818

所以我的建议是保持你的结构不变,但在调用这行代码之前:

var value = $filter('date')(text, "yyyyMMdd");

您应该将您的类型转换为有效的日期格式。例如:

var d = new Date(text.substring(0,4), text.substring(4,6), text.substring(6));

然后:

var value = $filter('date')(d, "yyyyMMdd");