【发布时间】:2015-12-23 00:40:54
【问题描述】:
我是新来的,最近使用 Angular Material 0.11.0 提供的 md-datepicker 时遇到了一些问题: https://material.angularjs.org/0.11.0/#/demo/material.components.datepicker
简而言之,我的应用程序允许用户添加带有名称和描述的单个项目。他们还能够更新相关的项目详细信息。
添加和更新都是通过 Material Designs mdDialog 完成的。 一旦用户点击添加或更新,控制器就会调用相关函数,该函数调用我工厂中的相应函数。
工厂函数包含我配置的 $mdDialog 服务。 在添加 md-datepicker 之前,我能够毫无问题地更新和添加。
点击编辑时出现以下错误。
TypeError: date.toLocaleDateString is not a function
at Object.defaultFormatDate [as formatDate] (angular-material.js:6858)
at DatePickerCtrl.configureNgModel.ngModelCtrl.$render (angular-material.js:7182)
at Object.ngModelWatch (angular.js:25353)
at Scope.parent.$get.Scope.$digest (angular.js:15751)
at Scope.parent.$get.Scope.$apply (angular.js:16030)
at done (angular.js:10545)
at completeRequest (angular.js:10717)
at XMLHttpRequest.requestLoaded (angular.js:10658)
环顾四周,我发现我应该配置 md-datepicker。 我从https://material.angularjs.org/HEAD/#/api/material.components.datepicker/service/$mdDateLocaleProvider 中获得灵感,并将以下代码作为 .config 添加到我的主要 AngularJS 应用程序中(我正在使用 momentjs 根据用户的语言环境为用户提供日期)。
app.config(function($mdDateLocaleProvider) {
$mdDateLocaleProvider.formatDate = function(date) {
return moment(date).format('L');
};});
现在我可以在我的“添加”工厂中添加具有以下代码的项目。我什至可以添加我选择的日期,并且可以在纪元时间内将其保存到 Firebase。
return $mdDialog.show({
clickOutsideToClose: true,
controller: function($mdDialog) {
var vm = this;
vm.project = project;
vm.add = function(project) {
var date = new Date();
project.deadline = date.getTime();
if(project.deadline == undefined) {
project.deadline = null;
};
FBprojects.$add(project);
console.log(project);
$mdDialog.hide();
};
},
controllerAs: 'PAmodal',
templateUrl: 'views/newproject.html',
targetEvent: e
})
当我专门点击 md-datepicker 的日历图标来更改日期时(一旦打开更新 $mdDialog)就会出现问题。
TypeError: date.getFullYear is not a function
at CalendarCtrl.getDateId (angular-material.js:6427)
at angular-material.js:6349
at processQueue (angular.js:14678)
at angular.js:14694
at Scope.parent.$get.Scope.$eval (angular.js:15922)
at Scope.parent.$get.Scope.$digest (angular.js:15733)
at Scope.parent.$get.Scope.$apply (angular.js:16030)
at HTMLButtonElement.<anonymous> (angular.js:23486)
at HTMLButtonElement.jQuery.event.dispatch (jquery.js:4435)
at HTMLButtonElement.jQuery.event.add.elemData.handle (jquery.js:4121)(anonymous function) @ angular.js:12450ident.$get @ angular.js:9237processQueue @ angular.js:14686(anonymous function) @ angular.js:14694parent.$get.Scope.$eval @ angular.js:15922parent.$get.Scope.$digest @ angular.js:15733parent.$get.Scope.$apply @ angular.js:16030(anonymous function) @ angular.js:23486jQuery.event.dispatch @ jquery.js:4435jQuery.event.add.elemData.handle @ jquery.js:4121
Uncaught TypeError: end.getFullYear is not a function
TypeError: date.getFullYear is not a function
at CalendarCtrl.getDateId (http://localhost:9000/bower_components/angular-material/angular-material.js:6427:12)
at CalendarCtrl.focus (http://localhost:9000/bower_components/angular-material/angular-material.js:6298:23)
at http://localhost:9000/bower_components/angular-material/angular-material.js:7372:30
at http://localhost:9000/bower_components/angular-material/angular-material.js:1068:11
at Array.forEach (native)
at processQueue (http://localhost:9000/bower_components/angular-material/angular-material.js:1067:15)
at http://localhost:9000/bower_components/angular/angular.js:17788:31
at completeOutstandingRequest (http://localhost:9000/bower_components/angular/angular.js:5498:10)
at http://localhost:9000/bower_components/angular/angular.js:5775:7
此时 md-datepicker 不知道它是哪一年,从 1933 年左右开始。奇怪的是,如果我不点击图标并先更改输入中的日期,我可以点击带来的图标在正确的日期列出日历。只要我当前的 mdDialog 没有关闭,我就可以做到这一点。然后,当我单击更新时,它有时会更新 firebase 上的日期。我仍然没有弄清楚为什么它不一致。通过控制器调用以下代码来更新项目
。如果我保持 md-datepicker 不变,我可以很好地更改我的其他数据。
updateProject: function(e, currentProject) {
return $mdDialog.show({
clickOutsideToClose: true,
controller: function($mdDialog) {
var vm = this;
vm.project = {};
vm.project = currentProject;
var pid = $stateParams.pid;
var n = vm.project.deadline;
var d = new Date(n).toString();
vm.update = function() {
//Updates at FB locations with updated project
ref.child('projects').child(pid).update({
title: vm.project.title,
description: vm.project.description,
deadline: d
});
$mdDialog.hide();
};
},
controllerAs: 'PEmodal',
templateUrl: 'views/updateproject.html',
parent: angular.element(document.body),
targetEvent: e
});
我一直在这个问题上停留一段时间没有解决方案,希望能对此有所了解。谢谢大家的时间。
【问题讨论】:
-
你能不能提供小提琴它会更容易解决哟
-
嗨,我很难让它在 JSFiddle 上工作。只是没有回应。我会添加我发现的其他内容
-
根据您的范围,我们目前发现 $mdDialog 和
clickOutsideToClose: true存在问题。可能取决于您的范围。试试把它改成false,看看能不能正常运行! -
嗨,我试过了,到目前为止没有任何区别。目前正在处理其他事情,并将返回以进一步调查。我会记住范围界定。感谢您的建议!
-
FWIW,我遇到了这个问题,因为我的 init 模型的日期不是 JavaScript
Date对象(它是moment.format())。使用new Date()可以解决问题。见material.angularjs.org/latest/api/directive/mdDatepicker
标签: javascript angularjs datepicker firebase angular-material