Model不是AngularJS中输入的日期对象

Pro*_*eus 31 javascript date angularjs

使用AngularJS我试图使用输入显示日期type=date:

<input ng-model="campaign.date_start" type="date">
Run Code Online (Sandbox Code Playgroud)

但是,这会产生以下错误:

Error: error:datefmt
Model is not a date object
Run Code Online (Sandbox Code Playgroud)

该日期实际上来自JSON API,格式如下:

date_start": "2014-11-19"
Run Code Online (Sandbox Code Playgroud)

我认为我可以通过使用过滤器解决它,但这不起作用,我得到相同的错误:

 <input ng-model="campaign.date_start | date" type="date">
Run Code Online (Sandbox Code Playgroud)

我也尝试将字符串转换为日期,但我又得到了同样的错误:

 $scope.campaign.date_start = Date(campaign.date_start);
Run Code Online (Sandbox Code Playgroud)

我还能尝试什么?

小智 42

你可以使用这个指令;

angular.module('app')
.directive("formatDate", function(){
  return {
   require: 'ngModel',
    link: function(scope, elem, attr, modelCtrl) {
      modelCtrl.$formatters.push(function(modelValue){
        return new Date(modelValue);
      })
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

在你的HTML;

<input type="date" ng-model="date" format-date>
Run Code Online (Sandbox Code Playgroud)

$formatters

Array.<Function>

每当模型值发生变化时,作为管道执行的函数数组.函数以反向数组顺序调用,每个函数都将值传递给下一个.最后一个返回值用作实际DOM值.用于格式化/转换值以在控件中显示.

  • 很好的解决问题.但我有点恼火,这个问题首先存在.为什么框架不为我们处理这个?现在我们必须解析serverkode(因为我们无法从JSON-Respons获取JavaScript Date对象)或者编写指令来使用日期输入. (3认同)
  • 还要提一下,当从*日期输入中读取*时(例如,将数据保存到服务器时)也可以操作日期:使用$ parsers,就像在上面的答案中使用$ formatters一样. (2认同)

rye*_*lar 22

你必须实例化campaign.date_startDate不使用它作为一个功能.

它应该看起来像这样(小演示):

$scope.campaign.date_start = new Date(campaign.date_start);
Run Code Online (Sandbox Code Playgroud)


Jak*_*ski 6

cs1707的指令是很好的,除非日期的范围值是null或者undefined它将初始化日期1/1/1970.这对大多数人来说可能不是最佳选择

下面是cs1707's指令的修改版本,它将保留null/ undefinedmodel:

angular.module('app').directive("formatDate", function() {
    return {
        require: 'ngModel',
        link: function(scope, elem, attr, modelCtrl) {
            modelCtrl.$formatters.push(function(modelValue) {
                if (modelValue){
                    return new Date(modelValue);
                }
                else {
                    return null;
                }
            });
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

在你的HTML;

<input type="date" ng-model="date" format-date>
Run Code Online (Sandbox Code Playgroud)

另外一个选项

如果要将此应用于date类型的所有输入,则无需将format-date属性添加到每个input元素.您可以使用以下指令.(请注意这一点,因为它可能以意想不到的方式与其他自定义指令交互.)

angular.module('app').directive("input", function() {
    return {
        require: 'ngModel',
        link: function(scope, elem, attr, modelCtrl) {
            if (attr['type'] === 'date'){
                modelCtrl.$formatters.push(function(modelValue) {
                    if (modelValue){
                        return new Date(modelValue);
                    }
                    else {
                        return null;
                    }
                });
            }

        }
    };
});
Run Code Online (Sandbox Code Playgroud)

在你的HTML;

<input type="date" ng-model="date">
Run Code Online (Sandbox Code Playgroud)