javascript - AngularJS data-binding av Chrome DateTime-kontroll fungerer ikke etter oppdatering 24.0.1312.52
Håper noen andre også la merke til dette:-
Vi bruker AngularJS 1.0 og bruker type="date" med elementet for å få Chromes fine standard dato- og tidsvelger. Alt fungerte bra til Chrome nylig oppdaterte seg til [24.0.1312.52]. Nå, hvis jeg endrer dato ved hjelp av dato- og tidsvelgeren, lagrer ikke AngularJS datainnbindingen det til det bundne JSON-egenskapen på $scope.
Hvis jeg endrer dato via en hvilken som helst tast på tastaturet, lagrer datatilknytning datoen til egenskapen bind.
Hva kan være årsaken til at dette problemet oppstår?
Svar #1
Jeg har lagt merke til samme oppførsel og lagt merke til at Sutikshan var på rett vei.
HTML 5 datainput krever at verdien er i RFC 3339-format, derfor kan vi justere vår AngularJS input-direktiv for å formatere og analysere verdien tilsvarende.
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;
}];
}
};
}]);
Grunnleggende er at vi sørger for at NgModelController bruker våre $formatters og $parsers når vi oppdaterer henholdsvis visningsverdien og modellverdien.
Svar #2
Vi fikk hjelp i AngularJS Google-gruppen:-
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());
});
});
}
}
};
});
