[英]Angular.js and HTML5 date input value — how to get Firefox to show a readable date value in a date input?
我有一個HTML5日期輸入,我希望默認情況下將其值設置為我的模型中的日期屬性的值。 我對格式化並不是太挑剔,因為Chrome似乎根據我的語言環境決定對我來說,但理想情況下格式將始終為dd/MM/yyyy
。
這是我設置輸入的方式:
<input type="date"
ng-model="date"
value="{{ date | date: 'yyyy-MM-dd' }}" />
這在Chrome上工作正常,默認情況下我會看到以下內容:
(我仍然不太明白為什么必須在yyyy-MM-dd
給出值,如果Chrome仍然根據我的語言環境對其進行格式化,但這是一個不同的問題。)
我的問題是Firefox沒有以我指定的方式顯示日期的值。 我認為這與將輸入綁定到date
模型有關,因為我可以在value
屬性中指定幾乎任何字符串,並且我仍然會在輸入中看到默認的長日期字符串:
如果我從輸入標簽中刪除ng-model="date"
,Firefox會很好地顯示我給它的任何值。 我不認為輸入綁定的模型實際上對其默認值有任何影響?
我理解普遍不支持日期輸入,但看到它應該依賴於一個簡單的文本輸入,我不明白為什么它的值不會僅僅是2013-08-05
,由angular的日期過濾器指定。
那么,如何讓Firefox在日期輸入中接受我的格式化值?
注意在用戶完成編輯后,我當然會執行驗證並將每個日期輸入值轉換為正確的Date
對象。 不確定這是否與問題相關,而是將其放在那里以防萬一,因為輸入格式顯然需要保持一致,以便日期轉換在所有瀏覽器中都能正常工作。 當然有問題,Chrome決定我的輸入格式......
問題是當存在ng-model
時忽略value
。
Firefox目前不支持type="date"
,它會將所有值轉換為字符串。 既然你(正確地)希望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
變量(請參閱有關此主題的文檔 )。 請注意我使用了yyyy-MM-dd
,因為它是JavaScript Date
對象直接支持的格式。 如果您想使用另一個,您必須自己進行轉換 。
編輯
這是一種制作干凈指令的方法:
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
, 為什么價值必須以yyyy-MM-dd給出?
根據HTML 5的輸入類型=日期規范 ,該值必須采用yyyy-MM-dd
格式,因為它采用RFC3339中指定的有效full-date
格式
full-date = date-fullyear "-" date-month "-" date-mday
與Angularjs無關,因為指令輸入不支持date
類型。
如何讓Firefox在日期輸入中接受我的格式化值?
FF不支持至少高達版本24.0的date
輸入類型。 您可以從這里獲得此信息。 因此,就目前而言,如果您使用類型為FF的date
輸入,則文本框將采用您傳入的任何值。
我的建議是你可以使用Angular-ui的Timepicker而不使用HTML5支持日期輸入。
你可以使用它,它工作正常:
<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>
就我而言,我已經解決了這個問題:
$scope.MyObject = // get from database or other sources;
$scope.MyObject.Date = new Date($scope.MyObject.Date);
和輸入類型日期是好的
我用過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; }; } ]);
<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>
檢查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")
如果使用Angular Material Design,您可以在那里使用datepicker組件,這將適用於Firefox,IE等。
https://material.angularjs.org/latest/demo/datepicker
雖然公平警告 - 個人經驗是這方面存在問題,而且目前似乎正在重新工作。 看這里:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.