md- datePicker - 始终为日期实例错误

时间:2016-09-14 13:17:23

标签: javascript angularjs datepicker angular-material

我收到此错误The ng-model for md-datepicker must be a Date instance. Currently the model is a: string。我正在使用片刻..

在视图中

<md-datepicker ng-model="Model.currentContact.getSetIncorporated" ng-model-options="{ getterSetter: true }" md-placeholder="Enter date"></md-datepicker>

在模型中

Contact.prototype.getSetIncorporated = function(date) {
        if (arguments.length) {
            this.company.information.incorporatedObject = date;
            this.company.information.incorporated = moment.utc(date).format('X');
        }
        if (!this.company.information.incorporatedObject) {
            if (this.company.information.incorporated !== '') {
                this.company.information.incorporatedObject = moment.utc(this.company.information.incorporated, 'X').toDate();
            } else {
                this.company.information.incorporatedObject = null;
            }}
        return this.company.information.incorporatedObject;
    }

此外,我尝试了几个mdLocale.formatDate和parseDate。当前版本是

$mdDateLocale.formatDate = function(date) {

            return moment(date).format('YYYY/MM/DD');
        };

        $mdDateLocale.parseDate = function(dateString) {

            var m = moment(dateString, 'YYYY/MM/DD', true);
            return m.isValid() ? m.toDate() : new Date(NaN);
        };

服务器正在发送此字符串2016-09-10T22:00:00.000Z

当我使用新的Date()将该字符串转换为Date对象时,我在mdDatePicker中显示正确的结果,但我也得到了 Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting! 哪个刹车我的页面。

2 个答案:

答案 0 :(得分:1)

这很简单。您传递给Model.currentContact.getSetIncorporated的值是字符串而不是日期。

以下是问题的一个示例 - CodePen。控制台显示错误。

angular.module('MyApp',['ngMaterial'])

.controller('AppCtrl', function() {
  this.myDate = new Date();
  this.myDate = this.myDate.toString(); // Comment this out to work correctly
});

这个问题 - How to check whether an object is a date? - 将解释如何检查您是否传递字符串或日期。

<强>更新

消息的原因

  

未捕获错误:[$ rootScope:infdig] 10 $ digest()已达到迭代次数。

似乎是因为Contact.prototype.getSetIncorporated正在返回日期。返回字符串有效但ng-model需要日期!

这是一种解决问题的方法 - CodePen

angular.module('MyApp',['ngMaterial'])

.controller('AppCtrl', function($scope) {
  this.myDate = new Date();

  this.test = function () {
    return new Date();
  }  
  this.testModel = this.test();
});

标记

<div ng-controller="AppCtrl as vm" ng-cloak="" class="datepickerdemoBasicUsage" ng-app="MyApp">
  <md-content>
    <md-datepicker ng-model="vm.testModel"  ng-model-options="{ getterSetter: true }" ng-change="change()"></md-datepicker>
  </md-content>
</div>

答案 1 :(得分:0)

当你使用时,你必须从瞬间获取_d属性:

    var _convertStringToDate = function (stringDate) {

        var date;
        if (angular.isString(stringDate)) {
            date = moment(stringDate)._d;
        }

        return date;
    };