我有一个HTML5日期输入,我希望默认情况下将其值设置为模型中date属性的值。我对格式化并不太挑剔,因为Chrome似乎根据我的语言环境决定对我来说,但理想情况下格式将始终为dd/MM/yyyy
。
这是我设置输入的方式:
<input type="date"
ng-model="date"
value="{{ date | date: 'yyyy-MM-dd' }}" />
这在Chrome上运行正常,默认情况下我会看到以下内容:
(我仍然不太明白为什么必须在yyyy-MM-dd
中提供该值,如果Chrome仍然根据我的语言环境对其进行格式化,但这是一个不同的问题。) < / p>
我的问题是Firefox没有以我指定的方式显示日期的值。我认为这与将输入绑定到date
模型有关,因为我可以在value
属性中指定几乎任何字符串,并且我仍然会在输入中看到长日期字符串:
如果我从输入标记中删除ng-model="date"
,Firefox会很好地显示我给它的任何值。我不认为输入绑定的模型实际上对其默认值有任何影响吗?
我理解普遍不支持日期输入,但看到它应该依赖于简单的文本输入,我不明白为什么它的值不会简单地为2013-08-05
,由角度的日期过滤器。
那么,如何让Firefox在日期输入中接受我的格式化值?
注意在用户完成编辑后,我当然会执行验证并将每个日期输入值转换为正确的Date
对象。不确定这是否与问题相关,而是将其放在那里以防万一,因为输入格式显然需要保持一致,以便日期转换在所有浏览器中都能正常工作。当然,问题在于Chrome为我决定输入格式......
答案 0 :(得分:72)
问题在于value
is ignored when ng-model
is present。
目前不支持type="date"
的Firefox会将所有值转换为字符串。既然你(正确地)希望date
成为真正的Date
对象而不是字符串,我认为最好的选择是创建另一个变量,例如dateString
,然后将它们链接起来变量:
<input type="date" ng-model="dateString" />
function MainCtrl($scope, dateFilter) {
$scope.date = new Date();
$scope.$watch('date', function (date)
{
$scope.dateString = dateFilter(date, 'yyyy-MM-dd');
});
$scope.$watch('dateString', function (dateString)
{
$scope.date = new Date(dateString);
});
}
实际结构仅供演示之用。你最好创建自己的指令,尤其是为了:
yyyy-MM-dd
,NgModelController#$formatters
和NgModelController#$parsers
而不是人工dateString
变量(请参阅documentation关于此主题)。请注意我使用了yyyy-MM-dd
,因为它是JavaScript Date
对象直接支持的格式。如果你想使用另一个,你必须自己make the conversion。
修改强>
这是一种制作干净指令的方法:
myModule.directive(
'dateInput',
function(dateFilter) {
return {
require: 'ngModel',
template: '<input type="date"></input>',
replace: true,
link: function(scope, elm, attrs, ngModelCtrl) {
ngModelCtrl.$formatters.unshift(function (modelValue) {
return dateFilter(modelValue, 'yyyy-MM-dd');
});
ngModelCtrl.$parsers.unshift(function(viewValue) {
return new Date(viewValue);
});
},
};
});
这是一个基本指令,仍有很大的改进空间,例如:
yyyy-MM-dd
,答案 1 :(得分:12)
为什么必须在yyyy-MM-dd中给出值?
根据HTML 5的input type = date spec,值必须采用yyyy-MM-dd
格式,因为它采用RFC3339中指定的有效full-date
格式如
full-date = date-fullyear "-" date-month "-" date-mday
与Angularjs无关,因为指令输入不支持date
类型。
如何让Firefox在日期输入中接受格式化的值?
FF不支持date
类型的输入,至少版本为24.0。您可以从here获取此信息。所以现在,如果在FF中使用类型为date
的输入,则文本框将采用您传入的任何值。
我的建议是您可以使用Angular-ui's Timepicker并且不要使用HTML5支持来输入日期。
答案 2 :(得分:3)
你可以使用它,它工作正常:
<input type="date" class="form1"
value="{{date | date:MM/dd/yyyy}}"
ng-model="date"
name="id"
validatedateformat
data-date-format="mm/dd/yyyy"
maxlength="10"
id="id"
calendar
maxdate="todays"
ng-click="openCalendar('id')">
<span class="input-group-addon">
<span class="glyphicon glyphicon-calendar" ng-click="openCalendar('id')"></span>
</span>
</input>
答案 3 :(得分:1)
就我而言,我已经解决了这个问题:
$scope.MyObject = // get from database or other sources;
$scope.MyObject.Date = new Date($scope.MyObject.Date);
并且输入类型日期正常
答案 4 :(得分:0)
我使用了ng-change:
Date.prototype.addDays = function(days) {
var dat = new Date(this.valueOf());
dat.setDate(dat.getDate() + days);
return dat;
}
var app = angular.module('myApp', []);
app.controller('DateController', ['$rootScope', '$scope',
function($rootScope, $scope) {
function init() {
$scope.startDate = new Date();
$scope.endDate = $scope.startDate.addDays(14);
}
function load() {
alert($scope.startDate);
alert($scope.endDate);
}
init();
// public methods
$scope.load = load;
$scope.setStart = function(date) {
$scope.startDate = date;
};
$scope.setEnd = function(date) {
$scope.endDate = date;
};
}
]);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div data-ng-controller="DateController">
<label class="item-input"> <span class="input-label">Start</span>
<input type="date" data-ng-model="startDate" ng-change="setStart(startDate)" required validatedateformat calendar>
</label>
<label class="item-input"> <span class="input-label">End</span>
<input type="date" data-ng-model="endDate" ng-change="setEnd(endDate)" required validatedateformat calendar>
</label>
<button button="button" ng-disabled="planningForm.$invalid" ng-click="load()" class="button button-positive">
Run
</button>
</div <label class="item-input"> <span class="input-label">Start</span>
<input type="date" data-ng-model="startDate" ng-change="setStart(startDate)" required validatedateformat calendar>
</label>
<label class="item-input"> <span class="input-label">End</span>
<input type="date" data-ng-model="endDate" ng-change="setEnd(endDate)" required validatedateformat calendar>
</label>
&#13;
答案 5 :(得分:0)
检查MEAN.JS(Angular.js,bootstrap,Express.js和MongoDb)的完整功能指令
基于@Blackhole的回复,我们刚刚完成它与mongodb和express一起使用。
它允许您从猫鼬连接器
保存和加载日期希望它能帮助!!
angular.module('myApp')
.directive(
'dateInput',
function(dateFilter) {
return {
require: 'ngModel',
template: '<input type="date" class="form-control"></input>',
replace: true,
link: function(scope, elm, attrs, ngModelCtrl) {
ngModelCtrl.$formatters.unshift(function (modelValue) {
return dateFilter(modelValue, 'yyyy-MM-dd');
});
ngModelCtrl.$parsers.push(function(modelValue){
return angular.toJson(modelValue,true)
.substring(1,angular.toJson(modelValue).length-1);
})
}
};
});
JADE / HTML:
div(date-input, ng-model="modelDate")
答案 6 :(得分:0)
如果使用Angular Material Design,您可以在那里使用datepicker组件,这将在Firefox,IE等中使用。
https://material.angularjs.org/latest/demo/datepicker
虽然公平警告 - 个人经验是这方面存在问题,而且目前似乎正在重新工作。见这里: