Угловатый.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, и я вижу следующее по умолчанию:



Chrome displaying the formatted value of the date



(я все еще не совсем понимаю, почему значение должно было быть дано в yyyy-MM-dd, Если Chrome все еще форматирует его на основе моей локали, но это другой вопрос.)



моя проблема заключается в том, что Firefox не показывает значение даты так, как я указал. Я думаю, что это связано с привязкой ввода к date модель, потому что я могу указать практически любую строку value атрибут, и я все равно буду видеть долго строка даты во входных данных по умолчанию:



Firefox showing datestring



если я удалить ng-model="date" из тега ввода Firefox красиво отображает любое значение, которое я ему даю. Я не думал, что модель, к которой был привязан вход, действительно повлияла на ее значение по умолчанию?



Я понимаю, что ввод даты не поддерживается повсеместно, но, видя, что он должен вернуться к простому вводу текста, я не понимаю, почему его значение не будет просто 2013-08-05, как указано датой angular фильтр.



Итак, как мне заставить Firefox принять мое форматированное значение во вводе даты?





Примечание после того, как изменения были сделаны пользователем, я, конечно, выполню проверку и преобразую каждое входное значение даты в правильное

688   7  

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, потому что это формат, напрямую поддерживаемый 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

справедливое предупреждение, хотя-личный опыт заключается в том, что есть проблемы с этим, и, похоже, в настоящее время он перерабатывается. Смотрите здесь:

https://github.com/angular/material/issues/4856

Comments

    Ничего не найдено.