Угловатый.JS и HTML5 date input value - как получить Firefox, чтобы показать читаемое значение даты во вводе даты?
у меня есть ввод даты HTML5, и я хотел бы, чтобы его значение было установлено в значение свойства date в моей модели по умолчанию. Я не слишком привередлив в форматировании, так как 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 принять мое форматированное значение во вводе даты?
Примечание после того, как изменения были сделаны пользователем, я, конечно, выполню проверку и преобразую каждое входное значение даты в правильное
7 ответов:
проблема в том, что
valueигнорируется, еслиng-modelприсутствует.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
почему значение должно было быть указано в гггг-ММ-ДД?
по словам тип ввода = "дата спецификации" HTML 5, значение должно быть в формате
yyyy-MM-ddтак как он принимает формат действительногоfull-date, который указан в RFC3339 какfull-date = date-fullyear "-" date-month "-" date-mdayнет ничего общего с Angularjs, так как вход директивы не поддерживает
dateтип.как мне получить Firefox примите мое форматированное значение во вводе даты?
FF не поддерживает
dateтип входного сигнала, по крайней мере до версии 24.0. Вы можете получить эту информацию от здесь. Поэтому прямо сейчас, если вы используете ввод с типомdateв FF текстовое поле принимает любое значение, которое вы передаете.мое предложение-вы можете использовать Angular-Ui'S 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>
проверьте эту полностью функциональную директиву на среднее значение.JS (угловой.js, bootstrap, Express.js и MongoDb)
основываясь на ответе @Blackhole s, Мы только что закончили его использовать с 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); }) } }; });нефрит / HTML:
div(date-input, ng-model="modelDate")
при использовании угловой материал дизайн, вы можете использовать элемент управления datepicker составляющая и это будет работать в Firefox и в IE и т. д.
https://material.angularjs.org/latest/demo/datepicker
справедливое предупреждение, хотя-личный опыт заключается в том, что есть проблемы с этим, и, похоже, в настоящее время он перерабатывается. Смотрите здесь:
Comments