javascript - AngularJS databindning av Chrome DateTime-kontroll fungerar inte efter uppdatering 24.0.1312.52


Hoppas att någon annan också märkte detta:-

Vi använder AngularJS 1.0 och använder type="date" med elementet för att få Chromes fina standard datum- och tidsväljare. Allt fungerade bra tills Chrome nyligen uppdaterade sig till [24.0.1312.52]. Nu, om jag ändrar datum med datum- och tidsväljaren, sparar inte AngularJS databindningen det till den binda JSON-egenskapen av $scope.

Om jag ändrar datum via en tangent på tangentbordet sparar datakopplingen datumet till den bundna egenskapen.

Vad kan vara orsaken som orsakar detta problem?

Svar #1

Jag har lagt märke till samma beteende och märkt att Sutikshan var på rätt väg.

HTML 5 inputdatum kräver att värdet är i RF 3339-format, därför kan vi justera vår AngularJS inputdirektiv för att formatera och tolka värdet därefter.

angular.module('myApp', []).directive('input', ['$filter',
function($filter) {
    return {
        require: '?ngModel',
        restrict: 'E',
        link: function(scope, element, attrs, ngModel) {
            if (!ngModel || attrs.type != "date") return;

            // Using AngularJS built in date filter, convert our date to RFC 3339
            ngModel.$formatters = [function(value) {
                return value && angular.isDate(value)
                    ? $filter('date')(value, 'yyyy-MM-dd')
                    : '';
            }];

            // Convert the string value to Date object.
            ngModel.$parsers = [function(value) {
                return value && angular.isString(value)
                    ? new Date(value)
                    : null;
            }];
        }
    };
}]);

Grunderna är att vi säkerställer att NgModelController använder våra $formatters och $parsers när vi uppdaterar visningsvärdet och modellvärdet, respektive.

Svar #2

Vi fick hjälp i AngularJS Google-grupp:-

https://groups.google.com/forum/?fromgroups=#!topic/angular/ycYzD3xRKS8

JSFeedle av Peter Bacon Darwin

http://jsfiddle.net/ZsRxj/

var module = angular.module('demoApp',[]);

module.directive('input', function () {
  return {
    require: '?ngModel',
    restrict: 'E',
    link: function (scope, element, attrs, ngModel) {
      if ( attrs.type="date" && ngModel ) {
        element.bind('change', function () {
          scope.$apply(function() {
            ngModel.$setViewValue(element.val());
          });
        });
      }
    }
  };
});